2016-11-24 40 views
1

當設置了DependencyProperty時,綁定目標(viewmodel)屬性立即獲取其新值還是異步執行?例如: -何時更新綁定?

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

然後,我明確設置IsEnabled屬性:

textBox.IsEnabled = false; 

我瞭解UpdateSourceTrigger設置,我相信這個問題是默認UpdateSourceTrigger.PropertyChanged值大多是相關的。

回答

2

簡短的答案是立即同步。

長的故事

我不會(一)結合的混合同步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);移至設置者即可。

1

您可以將getter setter屬性賦予textbox字段,並查找如何工作 like ..string st get {return _type; } set {_type = value; } ..所以你將有機會獲得價值,或者你可以應用驗證