究竟什么时候更新绑定?

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>

这是隐藏的代码。 MainWindowText 属性 这是绑定的来源。如果单击按钮,它会更新。如果您检查 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。