如何控制双向绑定的初始更新方向
本文关键字:绑定 方向 更新 何控制 控制 | 更新日期: 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
只是为了绑定目的而获取实际属性的一种方式。还有其他方法可以实现这一点,但这是更直接的方法。
我认为最好的选择是在模型类中设置一个默认值。这就是视图模型的用途。