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

时间:2016-01-10 15:56:04

标签: c# .net wpf data-binding dependency-properties

我偶尔遇到一种情况,我需要在属性上设置双向绑定,在这种情况下,首选设置绑定时,初始更新将在目标到源方向上执行,而不是源-达到目标。也就是说,当设置绑定时,更新源属性值,以便它反映目标属性值,该值保持不变。

这种情况可能吗?如果是的话,怎么办呢?

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

示例

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

3 个答案:

答案 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)

我认为最好的选择是在模型类中设置默认值。这是视图模型的目的。