何时更新绑定?
当设置了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; } ..所以你将有机会获得价值,或者你可以应用验证