INotifyPropertyChanged в WPF - PullRequest
       6

INotifyPropertyChanged в WPF

4 голосов
/ 09 ноября 2011

Попробуй понять WPF.Это мои тестовые классы:

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

А это 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>

Как заставить этот код работать?Я хочу, чтобы данные ComboBox были изменены после нажатия на кнопку и обновления MyList.PropertyChangedEventHandler всегда имеет значение null.

Ответы [ 2 ]

9 голосов
/ 09 ноября 2011

Проблема в том, что вы прямо устанавливаете исходный список на Window.DataContext, поэтому ничто никогда не слушает событие windows * PropertyChanged.

Чтобы решить эту проблему, установите DataContext насамо окно:

this.DataContext = this;

и затем измените Binding, так что обратитесь к свойству:

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

Вам также нужно будет изменить определение свойства, чтобы оно вызывало имя свойство изменяется, а не имя члена:

this.RaisePropertyChanged("MyList");
2 голосов
/ 09 ноября 2011

Я думаю, у вас есть две проблемы:

1) переплет должен быть: {Binding MyList}

2) в настройщике MyList вы должны использовать RaisePropertyChanged("MyList");

...