Wpf 绑定何时更新?
设置Wpf 绑定何时更新?,wpf,dependency-properties,Wpf,Dependency Properties,设置DependencyProperty时,绑定的目标(viewmodel)属性是立即获取其新值,还是异步发生?例如: <TextBox x:Name="textBox" IsEnabled="{Binding IsEnabled,Mode=TwoWay}"/> 我知道设置,我相信这个问题主要与默认的UpdateSourceTrigger.PropertyChanged值有关。您可以将getter setter属性赋予textbox字段,并了解其工作原理 like..string
DependencyProperty
时,绑定的目标(viewmodel)属性是立即获取其新值,还是异步发生?例如:
<TextBox x:Name="textBox" IsEnabled="{Binding IsEnabled,Mode=TwoWay}"/>
我知道设置,我相信这个问题主要与默认的
UpdateSourceTrigger.PropertyChanged
值有关。您可以将getter setter属性赋予textbox字段,并了解其工作原理
like..string st get{return\u type;}
设置{u type=value;}..这样你就有机会更改值,或者你可以应用验证。简短的回答是立即同步的 长话短说 我不会将
UpdateSourceTrigger
与绑定的同步性混为一谈。第一个定义应更新源属性的频率,例如,当控件失去焦点时,或者当调用UpdateSource
方法时
另一方面,给定绑定的同步性定义了源属性的get/set操作是同步还是异步执行的。实际上,只有在读取源属性可能需要很长时间的情况下,您才会看到差异。在这种情况下,默认情况下UI将被阻止
您可以通过属性控制绑定的同步性。下面是一个显示差异的示例。让我们从XAML开始:
<TextBox Text="{Binding Text, Mode=TwoWay}"/>
<Button Click="Button_Click">Update</Button>
如果运行此代码,您将观察到两件事:
- 应用程序启动缓慢
- 如果单击按钮,应用程序将挂起
<TextBox Text="{Binding Text,Mode=TwoWay, IsAsync=true}"/>
再次运行应用程序:
- 应用程序立即启动
- 如果单击按钮,应用程序不会挂起
Text
属性来执行,即只需移动System.Threading.Thread.Sleep(10000)代码>到setter
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}"/>