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

C# 如何控制双向绑定初始更新方向,c#,.net,wpf,data-binding,dependency-properties,C#,.net,Wpf,Data Binding,Dependency Properties,有时我会遇到这样的情况:我需要在属性上设置双向绑定,在这种情况下,在设置绑定时,初始更新将以目标到源的方向执行,而不是源到目标。也就是说,当绑定被设置时,源属性值被更新,以便它反映目标属性值,而目标属性值保持不变 这种情况可能吗?如果是的话,如何实现呢 当然有几种解决方法,比如缓存目标属性值、设置绑定,然后恢复缓存的值,但我感兴趣的是直接的答案,而不是解决方法 示例 假设我们有一个TextBox,其Text属性设置为“foo”。此外,我们还有一个视图模型,其名称属性(类型为字符串)设置为空。现在

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

这种情况可能吗?如果是的话,如何实现呢

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

示例


假设我们有一个
TextBox
,其
Text
属性设置为
“foo”
。此外,我们还有一个视图模型,其
名称
属性(类型为
字符串
)设置为
。现在我想要实现的是将
Text
属性绑定到
Name
属性,同时保留
的“foo”
值。这里重要的一点是避免将
Text
设置为
null
,然后返回到
“foo”
(无论出于何种原因,例如,因为清除
文本框会导致其他控件也被清除)。

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

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

所有代码都应该在“视图”代码中实现,而不是在“视图模型”中实现

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

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
属性只包含一个回调,用于在发生更改时设置绑定。您可以添加一些仅执行一次的奇特例程


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

问题是我希望保留当前值,而不是默认值。此外,此解决方案假设使用MVVM模式,而且该模型是“我的”,这也可能不是真的,例如绑定的源显式设置为其他WPF控件。您提到您有一个视图模型,因此,我认为您使用MVVM的假设是不正确的?您的视图模型应该设置所有默认值,并且不应该依赖WPF,因为您可以在其他应用程序(如universal apps等)中使用它。我不明白您为什么不想采用这种方法?请给我一个真实的例子,你想设置这样的默认值。事实上,我提到了一个视图模型,但只是作为一个例子。我有一个一般性的技术问题,我不想把它局限于一个特定的设计模式。我知道问题的每一个实例都可能存在一个解决方案,但我的兴趣是知道是否存在一种“通用”的方式来完成问题中描述的场景。另一个例子是,假设我正在开发一个控件库,最终用户在其中提供绑定,然后我需要在与布局相关的属性上设置该绑定,以便保存布局。我不知道是否存在虚拟机…谢谢你的关注。我知道这种技术(我在问题中提到它是一种变通方法),但它不是我想要的。另外,我不认为有必要在
Loaded
事件上执行此操作(在任何给定时间都可以正常工作),我认为检索绑定表达式并调用
UpdateSource()
是冗余的(设置
Text
属性时,源代码将自动更新)。