日期:2014-05-18  浏览次数:20789 次

xmal中对属性的访问
wpf中,xaml部分的代码如何访问C#代码部分定义的属性?比如我有类:

C# code

<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>




C# code

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.这样一个类,我如何在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()
{
//做你想做的控制。
}