究竟何时更新绑定?

时间:2016-11-24 09:55:23

标签: wpf dependency-properties

当设置DependencyProperty时,绑定目标(viewmodel)属性是立即获取其新值还是异步发生? E.g:

<TextBox x:Name="textBox" IsEnabled="{Binding IsEnabled,Mode=TwoWay}"/>

然后我明确设置了IsEnabled属性:

textBox.IsEnabled = false;

我知道UpdateSourceTrigger设置,我相信此问题主要与默认UpdateSourceTrigger.PropertyChanged值相关。

2 个答案:

答案 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; } ..所以你将有机会获得值,或者你可以应用验证