何时更新绑定?

问题描述:

当设置了DependencyProperty时,绑定目标(viewmodel)属性立即获取其新值还是异步执行?例如: -何时更新绑定?

<TextBox x:Name="textBox" IsEnabled="{Binding IsEnabled,Mode=TwoWay}"/> 

然后,我明确设置IsEnabled属性:

textBox.IsEnabled = false; 

我了解UpdateSourceTrigger设置,我相信这个问题是默认UpdateSourceTrigger.PropertyChanged值大多是相关的。

简短的答案是立即同步。

长的故事

我不会(一)结合的混合同步UpdateSourceTrigger。第一个定义了应该更新源属性的频率,例如当控件失去焦点或者也许当UpdateSource方法被调用......

在另一只手给定的绑定定义的同步性,如果获取/设置源属性的操作是同步或异步执行。在实践中,如果读取源属性可能需要很长时间才会看到差异。在这种情况下,默认情况下,UI将被阻止。

您可以通过Binding.IsAsync属性控制绑定的同步性。这是一个显示差异的例子。让我们从XAML开始:

<TextBox Text="{Binding Text, Mode=TwoWay}"/> 
<Button Click="Button_Click">Update</Button> 

这里是一个代码背后。 MainWindow具有Text属性,它是绑定的来源。如果点击一个按钮,它将被更新。如果您检查Text属性,您将看到需要10秒才能获得其值。

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private string _text; 
    public string Text 
    { 
     get 
     { 
      System.Threading.Thread.Sleep(10000); 
      return _text; 
     } 

     set 
     { 
      _text = value; 
      OnPropertyChanged(nameof(Text)); 
     } 
    } 

    public MainWindow() 
    { 
     DataContext = this; 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Text = DateTime.Now.ToString(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

如果你运行这段代码,你会看到两两件事:

  • 应用程序缓缓启动。
  • 如果您单击一个按钮,应用程序将挂起。

现在修改以这种方式结合:

<TextBox Text="{Binding Text,Mode=TwoWay, IsAsync=true}"/> 

运行应用程序再次:

  • 应用程序立即启动。
  • 如果您单击一个按钮,应用程序不会挂起。

类似的excerise可以用一个Text的属性来执行,即,只需将System.Threading.Thread.Sleep(10000);移至设置者即可。

您可以将getter setter属性赋予textbox字段,并查找如何工作 like ..string st get {return _type; } set {_type = value; } ..所以你将有机会获得价值,或者你可以应用验证