2016-11-24 5 views
1

Wenn eine DependencyProperty festgelegt ist, erhält die Eigenschaft "bound target (viewmodel)" sofort ihren neuen Wert oder geschieht dies asynchron? Z.B .:Wann genau werden Bindungen aktualisiert?

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

Dann explizit stelle ich die IsEnabled Eigenschaft:

textBox.IsEnabled = false; 

ich über die UpdateSourceTrigger Einstellung kennen, und ich glaube, diese Frage für den Standard UpdateSourceTrigger.PropertyChanged Wert meist relevant ist.

Antwort

2

Die kurze Antwort ist sofort und synchron.

Die lange Geschichte

ich nicht UpdateSourceTrigger mit (a) Synchronität der Bindung mischen würde. Der erste definiert, wie oft die Quelleneigenschaft z.B. wenn ein Steuerelement den Fokus verliert oder wenn die UpdateSource-Methode aufgerufen wird ...

Andererseits definiert die Synchronität einer gegebenen Bindung, ob get/set-Operationen einer Quelleigenschaft synchron oder asynchron ausgeführt werden. In der Praxis sehen Sie nur einen Unterschied, wenn das Lesen einer Quelleigenschaft lange dauern kann. In diesem Fall wird die Benutzeroberfläche standardmäßig gesperrt.

Sie können die Synchronität der Bindung über die Eigenschaft Binding.IsAsync steuern. Hier ist ein Beispiel, das einen Unterschied zeigt. Beginnen wir mit XAML:

<TextBox Text="{Binding Text, Mode=TwoWay}"/> 
<Button Click="Button_Click">Update</Button> 

Und hier ist ein Code dahinter. MainWindow hat Text Eigenschaft, die eine Quelle für eine Bindung ist. Wenn auf eine Schaltfläche geklickt wird, wird sie aktualisiert. Wenn Sie die Eigenschaft Text untersuchen, werden Sie sehen, dass es 10 Sekunden dauert, um den Wert zu erhalten.

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)); 
    } 
} 

Wenn Sie diesen Code ausführen, erhalten Sie 2 Dinge beachten:

  • Die Anwendung langsam beginnt.
  • Wenn Sie auf eine Schaltfläche klicken, hängt die Anwendung.

Jetzt ändern auf diese Weise verbindlich:

<TextBox Text="{Binding Text,Mode=TwoWay, IsAsync=true}"/> 

Führen Sie die Anwendung erneut:

  • Die Anwendung startet sofort.
  • Wenn Sie auf eine Schaltfläche klicken, hängt die Anwendung nicht.

Die ähnliche excerise kann mit einem Setzer von Eigenschaft durchgeführt werden, d. H.Bewegen Sie einfach System.Threading.Thread.Sleep(10000); zum Setter.

1

Sie können Getter Setter-Eigenschaften Textfeldfeld geben und finden, wie dies funktioniert like .. String st get {return _type; } set {_type = Wert; } .. und so erhalten Sie die Chance, Werte zu knnen oder Sie können die Validierung anwenden

Verwandte Themen