public class Calc { /// <summary> /// Add /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns> /// 此处参数为int型,所以需要Converter把TextBox中的数据string类型 /// 转换成int型,否则不会成功调用该方法 /// </returns> public int Add(int x, int y) { return x + y; } }
public class StringToInt : IValueConverter { public object Convert(object value, Type targetType, object parameter,CultureInfo culture) { return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return int.Parse(value.ToString()); } }
UpdateSourceTrigger 简单说明,具体查看 MSDN UpdateSourceTrigger
成员名称 | 说明 | |
---|---|---|
Default | 绑定目标属性的默认 UpdateSourceTrigger 值。 多数依赖项属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。 确定依赖项属性的默认 UpdateSourceTrigger 值的编程方法是使用 GetMetadata 来获取属性的属性元数据,然后检查DefaultUpdateSourceTrigger 属性的值。 |
|
PropertyChanged | 当绑定目标属性更改时,立即更新绑定源。 | |
LostFocus | 当绑定目标元素失去焦点时,更新绑定源。 | |
Explicit | 仅在调用 UpdateSource 方法时更新绑定源。 |
StringToInt converter = new StringToInt(); Calc calc = new Calc(); ObjectDataProvider odp = new ObjectDataProvider(); odp.MethodName = "Add"; odp.MethodParameters.Add(0); odp.MethodParameters.Add(0); odp.ObjectInstance = calc; Binding b1 = new Binding("MethodParameters[0]") { Source = odp, BindsDirectlyToSource = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; Binding b2 = new Binding("MethodParameters[1]") { Source = odp, BindsDirectlyToSource = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; //TextBox绑定的时候,不设置“.”所以需要设置Mode = BindingMode.OneWay //如果为TwoWay的话,当Text属性改变的时候会返回值给Source,而Source未设定需要变更的属性 //的值,而导致运行异常。使用Data作为Path,需要设置BindsDirectlyToSource=true //Binding b3 = new Binding("Data") { Source = odp, // Mode = BindingMode.OneWay, // BindsDirectlyToSource=true }; Binding b3 = new Binding("") { Source = odp, Mode = BindingMode.OneWay }; //当数据源本身代表数据的时候就是用”.“作为Path。个人通过尝试还可以使用""(空字符串)来代替 //TextBox绑定的时候必须要使用”.“ //ObjectDataProvider对象当作Binding的Source来使用时,这个对象本身就代表了数据 //Binding b3 = new Binding(".") { Source = odp}; //TextBlock绑定的时候可以不用”.“,也不需要设置 Mode = BindingMode.OneWay,因为TextBlock默认为OneWay // Binding b3 = new Binding("") { Source = odp }; b1.Converter = converter; b2.Converter = converter; txt1.SetBinding(TextBox.TextProperty, b1); txt2.SetBinding(TextBox.TextProperty, b2); txt3.SetBinding(TextBox.TextProperty, b3);
例如:
//将最后一个Binding改成如下形式 Binding b3 = new Binding("Length") { Source = odp, Mode = BindingMode.OneWay }; //把Add方法改成 public string Add(int x, int y) { return (x + y).ToString(); }结果会返回Data属性值的长度,也就是上面两个TextBox相加的和转换成string后的长度(Length是string的属性) (”在这种情况下,绑定引擎将计算相对于从 Data 属性获得的对象的 Path“ 的解释。)。
本例中: Note that BindsDirectlyToSource is set to true because we are binding to the MethodParameters property of the ObjectDataProvider instance and not properties of the object wrapped by the ObjectDataProvider (theCalc object).
具体内容查看MSDN BindsDirectlyToSource
<TextBox Name="txt1" Width="100" BorderBrush="Black"/> <TextBox Name="txt2" Width="100" BorderBrush="Black" /> <TextBox Name="txt3" Width="100" BorderBrush="Black" />
本文未处理输入的参数为字符串和溢出问题,只是个简单的Demo为了说明ObjectDataProvider如何工作的。