如何控制双向绑定的初始更新方向

本文关键字:绑定 方向 更新 何控制 控制 | 更新日期: 2023-09-27 18:29:52

我不时会遇到这样的情况,即我需要在属性上设置双向绑定,在设置绑定时,最好在目标到源的方向上执行初始更新,而不是在源到目标的方向上。也就是说,当设置绑定时,源属性值将被更新,从而反映保持不变的目标属性值。

这种情况可能发生吗?如果是这样,如何才能实现呢?

当然,有几种解决方法,例如缓存目标属性值、设置绑定,然后恢复缓存的值,但我感兴趣的是直接答案,而不是解决方法。

示例

假设我们有一个TextBox,其中Text属性设置为"foo"。此外,我们有一个视图模型,其Name属性(类型为string)设置为null。现在我想要实现的是将Text属性绑定到Name属性,同时保留"foo"值。这里的重要事项是避免将Text设置为null,然后再设置回"foo"(无论出于何种原因,例如因为清除TextBox会导致其他控件也被清除)。

如何控制双向绑定的初始更新方向

然后最佳实践是1)从控件中读取现有值(显然Xaml不应该具有数据绑定)。2) 在"Load"事件中,控件需要通过调用"SetBinding"来创建和建立数据绑定。3)最终获得控件的绑定表达式,并使用1)中的值更新源。

所有代码都应该在"View"代码中实现,而不是在"ViewModel"中实现

这个代码片段没有经过测试,但来自我在球场上的头脑。

private void Loaded(object sender, RoutedEventArg arg)
{
...
   var text = textBox.Text;
   var binding = new Binding();
   ... binding property here
   textBox.SetBinding(TextBox.TextProperty, binding);
   textBox.Text = text;
   var expression = BindingExpression.GetBindingExpression(textBox, TextBox.TextProperty);
   expression.UpdateSource();
}

创建一个可用于任何UIElement的附加属性怎么样?这应当满足普遍性要求。

<TextBlock Text="foo" 
           GlobalAttachedProperty:Value="{Binding Path=A_ValueFromVM_OR_SomeWhereElse}"
           GlobalAttachedProperty:Property="Text"/>

Value属性只包含一个回调,用于在发生更改时设置绑定。你可以添加一些只做一次的花式程序。

那么Property只是为了绑定目的而获取实际属性的一种方式。还有其他方法可以实现这一点,但这是更直接的方法。

我认为最好的选择是在模型类中设置一个默认值。这就是视图模型的用途。