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那里发了,已经关了。
<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那里发了,已经关了。
首先,Converter的ConverterParameter不可以是变量,必须常量,所以你想当参数的想法是不能实现的。
其次,我昨天就说了,你基本的东西没学明白。你这种设计本身就有问题。你应该是把Grid的高宽用的H,W绑定,H,W是数据源。你要想让这两个东西成比例,那就在H和W的Changed事件里面去处理。但是注意一点,不再属性的set方法里面做,要在依赖属性的PropertyChangedCallback里面做。
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#代码的属性和字段的问题,当然我这样的做法可能不符合设计思想,我只是说下我的想法)非常感谢各位的帮助,也许在提问中有很多不得当的地方,非常希望大家能指正,也希望大家能体谅我是一个初学者,对我的不当的地方能够多多包涵,非常感谢。
的类其实是包含这个逻辑树。就是说逻辑树不能在设计时访问自身范围之外的东西,因为它根本看不到。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()
{
//做你想做的控制。
}