如何在代码中设置和获取文本框的updatesourcetrigger?

时间:2011-11-03 04:03:08

标签: wpf textbox updatesourcetrigger

一个简短的问题:
在wpf中,如何在代码隐藏中设置和获取文本框的updatesourcetrigger? 感谢

更新:
我按照AngleWPF的代码:

        var bndExp = BindingOperations.GetBindingExpression(this, TextBox.TextProperty);

        var myBinding
          = bndExp.ParentBinding;

        var updateSourceTrigger = myBinding.UpdateSourceTrigger;

但我得到了例外:

  

未处理的类型异常   发生'System.Reflection.TargetInvocationException'   PresentationFramework.dll附加信息:异常已经存在   由调用目标引发。

3 个答案:

答案 0 :(得分:9)

UpdateSourceTrigger的{​​{1}}是什么意思?您的意思是说TextBox UpdateSourceTrigger的{​​{1}}?

E.g。如果您的TextBox.TextProperty Binding TextBox属性绑定到某个来源,那么您可以轻松获取myTextBox和{{1}通过Text调用对象。

UpdateSourceTrigger

但是对于已经使用的绑定设置 Binding是很棘手的。例如。在上述情况下,您将无法将GetBindingExpression()设置为其他内容。当绑定对象已被使用时,不允许这样做。

您可能必须深度克隆绑定对象并为其设置新的 var bndExp = BindingOperations.GetBindingExpression(myTextBox, TextBox.Textproperty); var myBinding = bndExp.ParentBinding; var updateSourceTrigger = myBinding.UpdateSourceTrigger; 并将其分配回UpdateSourceTriggermyBinding.UpdateSourceTrigger类不存在克隆。您可能必须编写自己的克隆代码。

UpdateSourceTrigger

或者,您也可以尝试分离现有的Binding并更新它并将其分配回来......

TextBox

如果有任何这些提示有帮助,请告诉我。

答案 1 :(得分:2)

实现它的另一种方法是在TextBox加载的eventhandler中设置绑定。 下面是TextBox的xaml:

    <TextBox Grid.Row="0" 
             x:Name="txtName"
             Text="{Binding Name}"
             Loaded="TxtName_OnLoaded" />

现在在TxtName_OnLoaded的代码后面,eventhandler将创建新的Binding对象并根据我们的需要对其进行初始化。我们还将ValidationRule添加到其中。

    private void TxtName_OnLoaded(object sender, RoutedEventArgs e)
    {
      ApplicationViewModel appVm = this.DataContext as ApplicationViewModel;
      TextBox TxtName = sender as TextBox;

      if (TxtName == null)
        return;

      Binding newBinding = new Binding("Name");
      newBinding.ValidatesOnDataErrors = true;
      newBinding.ValidatesOnExceptions = true;
      newBinding.NotifyOnValidationError = true;
      newBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
      validator.ErrorMessage = "Labware name should be unique.";
      validator.ApplicationViewModel = appVm;
      if (!newBinding.ValidationRules.Contains(validator))
        newBinding.ValidationRules.Add(validator);
      TxtName.SetBinding(TextBox.TextProperty, newBinding);
    }

正如您在上面的实现中所看到的,我们使用新的绑定路径创建了一个Binding对象。还将UpdateSourceTrigger分配给新创建的Binding对象。

绑定可以有多个验证规则。我们将在其中添加验证规则。现在我们可以将绑定设置为textbox的TextProperty。

好处:您可以从多个xaml无法使用的代码将多个依赖项对象绑定到Validation Rule对象的属性。例如:

我用它来验证TextChanged事件的输入,在那里我将输入与作为公共ObservableCollection属性存储的Items列表进行比较,并在ApplicationViewModel中与Grid绑定。 ValidationRule代码如下:

    public class UniqueValueValidator : ValidationRule
  {
    public string ErrorMessage { get; set; }
    public ApplicationViewModel ApplicationViewModel { get; set; }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
      if (value == null)
        return null;

      var lws = ApplicationViewModel.Inputs.Where(s => s.Name.Equals(value.ToString())).FirstOrDefault();
      if (lws != null)
        return new ValidationResult(false, ErrorMessage);


      return new ValidationResult(true, null);
    }
  }

上面的代码接受输入并检查“输入”可观察集合中的可用性。如果值存在,则规则给出错误的ValidationResult。通过这个实现,我在运行时检查输入的唯一性。

希望你们喜欢它。

答案 2 :(得分:0)

我认为这是正确的方法:

 Binding binding = new Binding();

 binding.Source = new CustomerViewModel();;
 binding.Path = new PropertyPath("Customer.Name");
 binding.Mode = BindingMode.TwoWay;
 binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
 txtCustName.SetBinding(TextBox.TextProperty, binding);