2011-11-09 11 views
2

WPFを理解してください。これは私のテストクラスである:WPFでINotifyPropertyChanged

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

そして、これは、このコードを動作させるためにどのよう

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

XAML

のですか?ボタンをクリックするとComboBoxのデータが変更され、MyListが更新されます。 PropertyChangedEventHandlerは常にnullです。

答えて

7

問題は、元のリストをWindow.DataContextに直接設定しているため、ウィンドウのPropertyChangedイベントを聞くことは一切ありません。この問題を解決するには

、ウィンドウ自体にDataContextを設定します。その後、

this.DataContext = this; 

とプロパティを参照するので、Bindingを変更:

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

あなたはまた、あなたの財産の定義を変更する必要がありますメンバー名ではなくプロパティの名前が変更されます。

私はあなたが二つの問題があると思う
1

:結合)

1は次のようになります。{Binding MyList}

2)MYLISTセッターにあなたはRaisePropertyChanged("MyList");

を使用する必要があります
関連する問題