wpf中,xaml部分的代码如何访问C#代码部分定义的属性?比如我有类:
<UserControl x:Class="CardTest.Card"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:CardTest"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Height="100" Width="100" x:Name="control">
    <Grid x:Name="GridMain" Background="Transparent">    </Grid>
</UserControl>
public partial class Card : UserControl
    {
        public Card()
        {
            InitializeComponent();
        }
        pubblic int IntValue = 100;
    }
  我想在xaml中设置IntValue的值,如实现C#中IntValue = 150;或使用IntValue的值,如GridMain的Width属性为GridMain.Width = IntValue;
在xaml中应该如何实现呢?(我看了xaml中对属性的使用和设置,有直接使用和元素的方式使用两种方法,但是这里使用的时候属性都是声明的外层实例所具有的,比如:
<Grid>
  <Grid.Width = "150"/>
</Grid>但是上面我想设置的属性是IntValue,明显不在UserControl中,我怎么设置呢?)其实问题是发生在我写IValueConverter.Convert方法的时候,在xmal中写了如下形式的内容:
xxxx="{Binding ElementName=xxxx,Path=xxxx,Converter={StaticResource xxxx},Mode=OneWay}"
想实现一种绑定,但是在转换的时候,我想给Converter传递进去一个参数作为转换的依据(如上边所说的IntValue),我在论坛上看到说可以用ConverterParameter=xxxx往里传,但是我直接写ConverterParameter=IntValue之后在Convert的parameter参数得到的是一个"IntValue"字串,显然不是我需要的,我应该怎么做呢?
当然我可以在xaml中声明资源<sys:Int32 x:Key="IntVal">100</sys:Int32>,然后用ConverterParameter={StaticResource IntVal}的方法设定ConverterParameter的值,但是有时候我的字段不想声明在xaml中啊,那么我在xaml中如何设置C#代码中声明的属性(如在xaml中实现上述所说的IntValue = 150;这样C#中的代码)和使用设置在C#代码中的属性(如在xaml中实现Width = IntValue;这样的C#代码)呢?可能我的想法不符合wpf的设计思想了,但是请问到底能不能在xaml中实现呢?非常感谢热心指教。另外请问这样类似的问题再这个版块问对不对啊,我刚才点错了,在silverlight那里发了,已经关了。

解决方案 »

  1.   

    请问有人帮忙么?现在我在Card里边写了连个新的属性(dependecyProperty),(int)HProperty和(int)WProperty,我想让这两个属性成一定比例,如10:7, 难道非要在C#代码里实现?在XAML中不能实现么?如果可以,怎么在以上代码中访问到这两个Card类的属性呢?(不在UserControl中存在的属性),谢谢
      

  2.   

    双向绑定是可以,但是我只知道如何在C#的代码中实现,我想问下,如上的H和W属性,如果我在C#代码中已经定义(DependencyProperty),那么能不能在XAML中实现双向绑定呢?具体怎么操作呢?多谢
      

  3.   

    又一次
    首先,Converter的ConverterParameter不可以是变量,必须常量,所以你想当参数的想法是不能实现的。
    其次,我昨天就说了,你基本的东西没学明白。你这种设计本身就有问题。你应该是把Grid的高宽用的H,W绑定,H,W是数据源。你要想让这两个东西成比例,那就在H和W的Changed事件里面去处理。但是注意一点,不再属性的set方法里面做,要在依赖属性的PropertyChangedCallback里面做。
      

  4.   

    感谢"wddw1986"的关注。
    1. "Converter的ConverterParameter不可以是变量,必须常量",这下知道了,非常感谢。
    2. 其实这个问题的本身并不是绑定的问题,我只是想知道,类似<Window x:Class="SomeApp.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SomeApp"
        x:Name="window"
        Title="Window1" Height="300" Width="300">
        <Grid x:Name="grid">    </Grid>
    </Window>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
            public int IntValue;
        }这样一个类,我如何在XAML代码部分设置IntValue的值?我不关心之后IntValue的变化,也就是类似在XAML中初始化一下IntValue而已。可能我的理解有问题,我的想法如下:
    XAML部分是不是可以理解为Window1这个类的中一部分表述性的说明,最后会转化为Window1的一部分。
    因此,在XAML部分声明的元素可以在C#代码部分进行访问(如grid元素),那么在C#代码部分声明的属性或字段,是否也能够在XAML部分通过某种语法访问到(并进行操作,比如设置初始值)?我只是想问问,这样的语法到底应该怎么写,或者是,根本就不能访问到?请将问题的重点放到"能不能"上,而不是"应不应该",也许我举的例子不恰当,但是我现在只是初学,我更关注wpf和xaml的语法层面的事情,用他们提供的功能我能做什么,而不是该不该这样做的问题。就像C#的winform,你可以完全不用event和form什么的,完全用api开发,当然,没有人会这样做,因为他不符合.net开发winform的思想,而且繁杂。但是,如果有人问,如何在C#中实现鼠标的api捕捉,你能说,你直接去用控件吧,上边都有click事件么?很多时候click事件能解决,但是有时候可能真的就需要对api直接操作啊。但初学者更关注的是,"哦,原来用c#可以操作api,我知道了",这样的问题,之后才能慢慢学习.net的设计思想什么的。所以我也只是想知道,到底在上面的XAML中,能不能通过某种语法访问到C#代码中定义的属性或字段,如果能,非常希望能指点下语法怎么写。3. 关于您刚才说的绑定的问题。对于H和W这样两个定义在C#代码中可以理解为数据源的属性,您的意思是如果让他们两个关联最好用PropertyChangedCallback属性。因为我的理解非常简单,我觉得,W和H相互依赖,所以我就理解为W和H相互绑定。所以我就用了:
                // binding w to h
                Binding binding = new Binding("H") { Source = this, Converter = new DoubleScan(), ConverterParameter=0.7 };
                this.SetBinding(WProperty, binding);这样的方式绑定了。结果是可以实现。我想问下,这样的做法和您提供的用PropertyChangedCallback属性的做法有什么区别?哪个做法更合理些?(另外,说点题外话,因为H和W的绑定关系是根据不同控件不一样的,所以我原来想把他们放到XAML中,作为template储存的,所以这就又来了上边所谓的在XAML中如何调用C#代码的属性和字段的问题,当然我这样的做法可能不符合设计思想,我只是说下我的想法)非常感谢各位的帮助,也许在提问中有很多不得当的地方,非常希望大家能指正,也希望大家能体谅我是一个初学者,对我的不当的地方能够多多包涵,非常感谢。
      

  5.   

    1.这样一个类,我如何在XAML代码部分设置IntValue的值?据我所知,应该是不能。2.XAML部分是不是可以理解为Window1这个类的中一部分表述性的说明,最后会转化为Window1的一部分。这个还不能这么理解,XAML应该看成是UI元素的 逻辑树 的声明,XAML只能定义逻辑树上的东西,而.cs代码定义
    的类其实是包含这个逻辑树。就是说逻辑树不能在设计时访问自身范围之外的东西,因为它根本看不到。3.再说你这个问题。你想实现的效果就是用H,W来控制Grid的高宽按比例变化,对吧。那就把Grid的高宽用H,W绑定上。然后在H,W的值改变事件里控制比例。并不是你的这个意思
                // binding w to h
                Binding binding = new Binding("H") { Source = this, Converter = new DoubleScan(), ConverterParameter=0.7 };
                this.SetBinding(WProperty, binding);而是这个意思,以下仅仅是个例子
            public static readonly DependencyProperty ResultItemProperty =
                DependencyProperty.Register("ResultItem", typeof(object), typeof(InputComboBox),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.AffectsRender,
                    (o, e) =>
                    {
                        if (o is InputComboBox)
                        {
                            (o as InputComboBox).OnResultItemChanged();
                        }
                    }));internal void OnResultItemChanged()
    {
    //做你想做的控制。
    }