绑定破坏Mode = OneWay直接赋值给DependencyProperty
我有一段非常简单的代码来理解当我们将Binding表达式赋值给任何依赖属性时会发生什么,然后为该依赖赋值直接值属性。以下是代码绑定破坏Mode = OneWay直接赋值给DependencyProperty
查看XAML
<StackPanel>
<Button Click="Button_Click" Content="Assign binding value" />
<Button Click="Button_Click_1" Content="Assign direct value" />
<TextBox Text="{Binding TextSource, Mode=OneWay}" x:Name="stf" />
</StackPanel>
查看XAML.cs
public partial class MainWindow : Window
{
MainViewViewModel vm = new MainViewViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
vm.TextSource = "Value set using binding";
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
stf.Text = "New direct value";
}
}
视图模型
public class MainViewViewModel : INotifyPropertyChanged
{
//INotifypropertychanged implementation here ...
private string _textSource;
public string TextSource
{
get { return _textSource; }
set
{
_textSource = value;
OnPropertyChanged("TextSource");
}
}
}
现在我的观察是
- 当我点击“分配绑定值”时,视图被更新为绑定源值。 (正如预期的那样)
- 当我点击“分配直接价值”的观点与分配给文本字段(正如预期的那样)直接值更新
- 我认为在这个阶段,结合被打破,当我再次点击“分配绑定值”它不应该工作,意味着没有UI更新。并根据我的预期工作(与预期的一样)
- 令人困惑的是,当我将绑定模式设置为“双向”,然后点3没有发生,并且它始终保持工作,无论我按哪个按钮。无论从约束力来源还是直接价值。 (我不清楚TwoWay绑定需要用这个做什么)
有人请澄清一下吗?
设置DependencyProperty
值时,DependencyObject
检查新值是否为BindingExpression
。如果不是,它会检查以前的值是否是绑定表达式。对于之前的绑定表达式,它会尝试设置表达式的值。尝试设置值时BindingExpression检查模式,而对于OneWay,它将返回false而不设置值,并停用和分离依赖项属性的绑定表达式。因此,对于Mode=OnWay
,绑定会取消激活并为依赖项属性分离。
对于TwoWay
,由于BindingExpression
能够设置该值,因此绑定不会被停用并继续工作。
我认为TwoWay
结合将在视图模型的属性的值,如果你在任何时候改变依赖属性的值(当你按下像分配到UI元素,的依赖属性,也按钮“分配直接值”),则依赖项属性的新值也将被分配给视图模型中的属性。
换句话说,我认为TowWay
模式实际上意味着该值可以从视图模型分配给用户界面,从用户界面分配给视图模型。
确实是双向绑定是针对两个方向的,但是为什么OneWay绑定源 - >目标更新在我为'TextField.Text'指定直接值时不起作用。在这两种情况下,我都在测试source-> target。 –
如果我理解正确,我认为你在原文中说的是真实的,当给TextField.Text赋值时,绑定会被破坏(尽管我从未见过这种东西)。说实话,我将不得不亲自测试这个场景,以便更多地讨论它。对不起,如果我没有太大的帮助。 – Agustin0987
感谢您的回答,您能否让我知道一些参考文档链接,以便我可以详细阅读它?此外,如果我们在自定义控件中拥有自定义依赖项属性,那么我们有责任在'DependencyPropertyChanged'事件中执行这些检查,还是在此之前完成? –
不幸的是,没有这样的引用,但是您可以反思DependencyObject SetValue函数以查看设置DP值所需的所有步骤。不,您不必担心这些检查,因为这些检查将由DependencyObject基类关注。 – Nitin