Comment WPF INotifyPropertyChanged travail?

C'est typique de INotifyPropertyChanged mise en œuvre pour l'utilisation de la Liaison en WPF/C#.

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

J'ai aussi un code XAML qui a une liaison CheckBoxState. Comment WPF INotifyPropertyChanged travail?

<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>

C'est le MainWindow.xaml.cs de lien entre le DataContext et le modèle.

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

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

Lorsque l'utilisateur définit la case à cocher, je pense qu'arriverait-il, est comme suit : IsChecked devient vrai, et avec "{Binding Path=CheckBoxState, Mode=TwoWay}", CheckBoxState propriété est vraie pour appeler RaisePropertyChanged() et en conséquence PropertyChanged(). En tant que paramètre de cette fonction est CheckBoxState, chaque Liaison avec le Chemin de CheckBoxState est notifié d'une mise à jour.

  • Comment cet appel active <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />? Quel est le C#magie de ce à faire il possible?
  • Pourquoi est if (PropertyChanged != null) nécessaire? Qui met en place la PropertyChanged à quelle valeur?
  • Le sens de Mode=TwoWay dirait que non seulement il peut signaler le changement, mais aussi les mises à jour du contenu lors de la autre élément de Liaison avec le même nom dans la liaison des changements, alors qu'en OneWay mode? Peut-on définir une Liaison que d'une seule source ou cible uniquement?
InformationsquelleAutor prosseek | 2011-07-22