究竟什么时候更新绑定?
Exactly when are bindings updated?
设置 DependencyProperty
后,绑定目标 (viewmodel) 属性 会立即获得新值还是异步发生?例如:
<TextBox x:Name="textBox" IsEnabled="{Binding IsEnabled,Mode=TwoWay}"/>
然后我显式设置 IsEnabled
属性:
textBox.IsEnabled = false;
我知道 UpdateSourceTrigger 设置,我相信这个问题主要与默认 UpdateSourceTrigger.PropertyChanged
值相关。
您可以将 getter setter 属性赋予文本框字段并了解其工作原理
像 ..string st get { return _type; }
设置 { _type = 值; }..所以你将有机会更改值或者你可以应用验证
简答即刻同步
说来话长
我不会将 UpdateSourceTrigger
与 (a) 绑定的同步性混为一谈。第一个定义源 属性 应该多久更新一次,例如当控件失去焦点时,或者当 UpdateSource
方法被调用时...
另一方面,给定绑定的同步性定义了源 属性 的 get/set 操作是同步执行还是异步执行。实际上,如果阅读来源 属性 可能需要很长时间,您只会看到差异。在这种情况下,默认 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}"/>
运行再次申请:
- 应用程序立即启动。
- 如果单击按钮,应用程序不会挂起。
可以使用 Text
属性 的设置器执行类似的练习,即只需将 System.Threading.Thread.Sleep(10000);
移动到 setter。
设置 DependencyProperty
后,绑定目标 (viewmodel) 属性 会立即获得新值还是异步发生?例如:
<TextBox x:Name="textBox" IsEnabled="{Binding IsEnabled,Mode=TwoWay}"/>
然后我显式设置 IsEnabled
属性:
textBox.IsEnabled = false;
我知道 UpdateSourceTrigger 设置,我相信这个问题主要与默认 UpdateSourceTrigger.PropertyChanged
值相关。
您可以将 getter setter 属性赋予文本框字段并了解其工作原理 像 ..string st get { return _type; } 设置 { _type = 值; }..所以你将有机会更改值或者你可以应用验证
简答即刻同步
说来话长
我不会将 UpdateSourceTrigger
与 (a) 绑定的同步性混为一谈。第一个定义源 属性 应该多久更新一次,例如当控件失去焦点时,或者当 UpdateSource
方法被调用时...
另一方面,给定绑定的同步性定义了源 属性 的 get/set 操作是同步执行还是异步执行。实际上,如果阅读来源 属性 可能需要很长时间,您只会看到差异。在这种情况下,默认 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}"/>
运行再次申请:
- 应用程序立即启动。
- 如果单击按钮,应用程序不会挂起。
可以使用 Text
属性 的设置器执行类似的练习,即只需将 System.Threading.Thread.Sleep(10000);
移动到 setter。