【发布时间】:2014-09-30 08:34:12
【问题描述】:
我有一个 TextBlock,它的 Text 属性绑定到一个 ViewModel 属性。绑定是单向的。 当我从 xaml.cs 更改控件的 Text 属性时,绑定被破坏。如果绑定是 TwoWay,我没有这个问题,但源属性也会更新。是否可以在不中断绑定的情况下进行 OneWay 绑定并更改目标属性值?
【问题讨论】:
标签: xaml winrt-xaml
我有一个 TextBlock,它的 Text 属性绑定到一个 ViewModel 属性。绑定是单向的。 当我从 xaml.cs 更改控件的 Text 属性时,绑定被破坏。如果绑定是 TwoWay,我没有这个问题,但源属性也会更新。是否可以在不中断绑定的情况下进行 OneWay 绑定并更改目标属性值?
【问题讨论】:
标签: xaml winrt-xaml
我建议一种解决方法,例如将 Binding 设置为 TwoWay 并忽略属性中的更新。像这样的:
private string textValue;
public string TextValue
{
get { return textValue; }
set
{
:
}
}
现在该属性不能再由视图设置。
【讨论】:
虽然没有提供代码,但这种情况通常发生在您将控件绑定到视图模型并且在稍后阶段您的逻辑尝试以编程方式更新控件中的值时。
您不应该尝试这样做,即为控件定义多个值来源。如果您将控件绑定到视图模型上的属性,那么要更新控件中的值,您应该更新视图模型中的字段。
如果您要在运行时以编程方式设置绑定控件的值,使其不再与绑定的对象值匹配,那么当某些其他事件导致重新评估控件绑定时,您以编程方式提供的值将如果再次被覆盖,您很容易会遇到您以编程方式提供的值对用户永远不可见的情况。
在这种情况下,您应该:
给视图模型添加一个new属性,将这个值绑定到控件,然后你的程序逻辑可以在数据加载时设置这个值等于原来的属性,并在你需要的时候更新到
根本不使用绑定,始终以编程方式写入控件,以便您严格控制值何时更新。
如果您绝对必须有一个解决方法,那么有一个解决方法。如果您使用已编译的绑定 (x:Bind),那么由于绑定已编译,因此可以在运行时对绑定的依赖属性调用 SetValue,并且仍将评估先前编译的绑定。但是我建议不要利用它,因为它会使您的代码更难跟踪和调试,当使用绑定时,我们倾向于不寻找直接寻址和设置控制值的代码。
【讨论】:
SetValue 方法设置依赖属性值而不影响绑定。