ObjectDataProvider实现Add

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

BindsDirectlyToSource

获取或设置一个值,该值指示是否计算相对于数据项或  DataSourceProvider  对象的  Path
常规行为(此属性为 false 时)包括对 DataSourceProvider 对象的特殊处理。   在这种情况下,绑定引擎将计算相对于从 Data 属性获得的对象的 Path   此外,绑定还侦听 DataChanged 事件并进行相应的操作。   将此属性设置为 true 将重写此行为并给予绑定访问 DataSourceProvider 对象本身的属性的权限。

例如:

//将最后一个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如何工作的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值