一个简短的问题:
在wpf中,如何在代码隐藏中设置和获取文本框的updatesourcetrigger?
感谢
更新:
我按照AngleWPF的代码:
var bndExp = BindingOperations.GetBindingExpression(this, TextBox.TextProperty);
var myBinding
= bndExp.ParentBinding;
var updateSourceTrigger = myBinding.UpdateSourceTrigger;
但我得到了例外:
未处理的类型异常 发生'System.Reflection.TargetInvocationException' PresentationFramework.dll附加信息:异常已经存在 由调用目标引发。
答案 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;
并将其分配回UpdateSourceTrigger
。 myBinding.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);