Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 绑定何时更新?_Wpf_Dependency Properties - Fatal编程技术网

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}"/>