当设置DependencyProperty
时,绑定目标(viewmodel)属性是立即获取其新值还是异步发生? E.g:
<TextBox x:Name="textBox" IsEnabled="{Binding IsEnabled,Mode=TwoWay}"/>
然后我明确设置了IsEnabled
属性:
textBox.IsEnabled = false;
我知道UpdateSourceTrigger设置,我相信此问题主要与默认UpdateSourceTrigger.PropertyChanged
值相关。
答案 0 :(得分:2)
简短的回答是立即和同步的。
长篇故事
我不会将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);
移动到设置器。
答案 1 :(得分:1)
您可以将getter setter属性提供给textbox字段并查找其工作原理 比如..string st get {return _type; } 设置{_type = value; } ..所以你将有机会获得值,或者你可以应用验证