2011-07-22 9 views
24

Jest to typowy INotifyPropertyChanged realizacja za korzystanie Wiązanie w WPF/C#.Jak działa WPF INotifyPropertyChanged?

namespace notifications.ViewModel 
{ 
    class MainViewModel : INotifyPropertyChanged 
    { 
     public const string NamePropertyName = "CheckBoxState"; 
     private bool _checkboxstate = true; 

     public bool CheckBoxState 
     { 
      get { return _checkboxstate; } 
      set 
      { 
       if (_checkboxstate == value) return; 
       _checkboxstate = value; 
       RaisePropertyChanged(NamePropertyName); 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
     private void RaisePropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

Mam też kod XAML, który ma wiązanie z CheckBoxState. enter image description here

<Grid> 
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <CheckBox Content="Click Me" IsChecked="{Binding Path=CheckBoxState, Mode=TwoWay}" /> 
     <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" /> 
    </StackPanel> 
</Grid> 

Jest to MainWindow.xaml.cs na związek między DataContext i modelu.

public partial class MainWindow : Window 
{ 
    notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = model; 
    } 
} 

Gdy użytkownik ustawia pole wyboru, myślę, co by się stało, jest następująca: IsChecked staje się prawdą, a z "{Binding Path=CheckBoxState, Mode=TwoWay}", CheckBoxState nieruchomość staje się prawdą zadzwonić RaisePropertyChanged() i odpowiednio PropertyChanged(). Jako parametr do tej funkcji jest CheckBoxState, każdy z Binding Path CheckBoxState jest zgłoszona aktualizowana.

  • Jak to połączenie aktywuje się <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />? Jaka jest magia C#, aby to umożliwić?
  • Dlaczego if (PropertyChanged != null) konieczne? Kto konfiguruje PropertyChanged na jaką wartość?
  • Znaczenie Mode=TwoWay wygląda, że ​​nie tylko może sygnalizować zmianę, ale także aktualizuje zawartość gdy inne Binding element o tej samej nazwie w wiązaniu zmienia, to co o trybie Oneway? Czy możemy ustawić wiązanie wyłącznie jako źródło lub cel?

Odpowiedz

19

W jaki sposób aktywuje się to połączenie? Co znajduje się w C# 's magia za to umożliwić?

Ten kod tworzy obiekt Binding, który łączy właściwość Text obiektu TextBlock z właściwością ViewModel. Dodaje również moduł obsługi zdarzeń dla zdarzenia ViewModel za PropertyChanged aby zaktualizować wartość tekstową, gdy ViewModel pożary zdarzenie PropertyChanged (z prawej własności).

Dlaczego wymagany jest if (PropertyChanged != null)? Kto konfiguruje wartość PropertyChanged do jakiej wartości?

Jeśli zdarzenie PropertyChanged ma wartość NULL, uruchomienie go spowoduje wyjątek NullReferenceException.

Znaczenie Mode=TwoWay wygląda, że ​​nie tylko może sygnalizować zmianę , ale także aktualizuje zawartość gdy inne Binding elementem z tej samej nazwie w wiązaniu zmian, to co o trybie Oneway? Czy możemy ustawić powiązanie tylko jako źródło lub cel?

Tryby wiążące są:

  • TwoWay: Zmienia wartość związanego gdy zmienia własności ViewModel i vice versa
  • OneWay: Zmienia wartość związanego gdy zmienia własności viewmodel tylko
  • OneWayToSource : Zmienia właściwość ViewModel, gdy powiązana wartość zmienia się tylko
  • OneTime: Ustawia powiązaną wartość z wartością właściwości ViewModel zaraz po utworzeniu aplikacji lub danych c zmiany w tekście.

Możesz przeczytać więcej o nich tutaj: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx

+1

wierzę, istnieje również tryb wiązania niegdyś, że tylko aktualizuje raz, w czasie, gdy kontrola jest załadowany. – Yuf

+0

@Yuf: Dobre miejsce: dodam to do mojej odpowiedzi. –

+0

Jak działa ta linia - PropertyChanged (this, new PropertyChangedEventArgs (propertyName)); – RSB

Powiązane problemy