簡短的答案是立即同步。
長的故事
我不會(一)結合的混合同步UpdateSourceTrigger
。第一個定義了應該更新源屬性的頻率,例如當控件失去焦點或者也許當UpdateSource
方法被調用......
在另一隻手給定的綁定定義的同步性,如果獲取/設置源屬性的操作是同步或異步執行。在實踐中,如果讀取源屬性可能需要很長時間纔會看到差異。在這種情況下,默認情況下,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}"/>
運行應用程序再次:
- 應用程序立即啓動。
- 如果您單擊一個按鈕,應用程序不會掛起。
類似的excerise可以用一個Text
的屬性來執行,即,只需將System.Threading.Thread.Sleep(10000);
移至設置者即可。