我偶尔遇到一种情况,我需要在属性上设置双向绑定,在这种情况下,首选设置绑定时,初始更新将在目标到源方向上执行,而不是源-达到目标。也就是说,当设置绑定时,更新源属性值,以便它反映目标属性值,该值保持不变。
这种情况可能吗?如果是的话,怎么办呢?
当然有几种解决方法,例如缓存目标属性值,设置绑定然后恢复缓存值,但我对直接答案感兴趣而不是解决方法。
示例
我们假设我们TextBox
的{{1}}属性设置为Text
。此外,我们将"foo"
属性(类型为Name
)的视图模型设置为string
。现在我想要实现的是将null
属性绑定到Text
属性,同时保留Name
值。这里重要的是避免将"foo"
设置为Text
然后返回null
(无论出于何种原因,例如因为清除"foo"
会导致其他控件也清除)。
答案 0 :(得分:0)
然后最佳实践是1)从控件中读取现有值(显然,Xaml不应该具有数据绑定)。 2)在“加载”事件中,控件需要通过调用“SetBinding”来创建和建立数据绑定。 3)最后使用1)中的值获取控件和更新源的绑定表达式。
所有代码都应在“查看”代码中实现,而不是在“ViewModel”中实现。
例如。)此代码段未经过测试,但来自我在球场的头部。
width=100%
答案 1 :(得分:0)
如何创建可用于任何UIElement的附加属性?这应该解决普遍性要求。
<TextBlock Text="foo"
GlobalAttachedProperty:Value="{Binding Path=A_ValueFromVM_OR_SomeWhereElse}"
GlobalAttachedProperty:Property="Text"/>
Value
属性只包含一个回调,用于在发生更改时设置绑定。你可以添加一些只做一次的花哨例程。
然后Property
只是获取绑定目的的实际属性的一种方法。还有其他一些方法可以实现这一目标,但这是更直接的方式。
答案 2 :(得分:-1)
我认为最好的选择是在模型类中设置默认值。这是视图模型的目的。