4 votes

INotifyPropertyChanged dans WPF

Essayez de comprendre WPF. Voici mes classes de test :

    public partial class MainWindow : Window, INotifyPropertyChanged
{
    private ObservableCollection<string> _myList = new ObservableCollection<string>();

    public ObservableCollection<string> MyList
    {
        get { return _myList; }
        set
        {
            _myList = value;
            RaisePropertyChanged("_myList");
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        comboBox1.DataContext = _myList;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        MyList = AnotherClass.SomeMethod();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

internal static class AnotherClass
{
    public static ObservableCollection<string> SomeMethod()
    {
        return new ObservableCollection<string> {"this","is","test"};
    }
}

Et voici XAML

<Grid>
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="65,51,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding}" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="310,51,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>

Comment faire fonctionner ce code ? Je veux que les données de la ComboBox soient modifiées après avoir cliqué sur le bouton et que MyList soit mise à jour. PropertyChangedEventHandler est toujours nul.

10voto

Steve Greatrex Points 8466

Le problème est que vous placez directement la liste originale sur la Window.DataContext pour que rien n'écoute jamais le système Windows. PropertyChanged événement.

Pour résoudre ce problème, définissez l'option DataContext à la fenêtre elle-même :

this.DataContext = this;

puis modifiez le Binding donc se référer à la propriété :

<ComboBox ItemsSource="{Binding MyList}" />

Vous devrez également modifier la définition de votre propriété afin qu'elle relève le nom de l'élément propriété qui est modifié, et non le nom du membre :

this.RaisePropertyChanged("MyList");

2voto

Teudimundo Points 1055

Je pense que vous avez deux problèmes :

1) la liaison devrait être : {Binding MyList}

2) sur le setter MyList vous devez utiliser RaisePropertyChanged("MyList");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X