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()
{
//做你想做的控制。
}