数据绑定和INotifyPropertyChanged

时间:2011-11-08 15:29:02

标签: c# wpf data-binding observablecollection

我有ComboBox从另一个类

获取数据
public partial class MainWindow : Window
{
      private ObservableCollection<MyDataClass> _myList = new ObservableCollection<MyDataClass>();

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

      private void Button_Click(object sender, EventArgs e)
      {
           _myList = AnotherClass.SomeMethod();
      }
}

点击按钮后更新ComboBox数据的唯一方法是在MyDataClass中实现INotifyPropertyChanged接口,还是有其他方法可以做到这一点?我寻找另一种方式,因为MyDataClass是从web服务生成的,所以我需要创建一些适配器类来实现INotifyPropertyChanged

2 个答案:

答案 0 :(得分:1)

public partial class MainWindow : Window, INotifyPropertyChanged
{
      private ObservableCollection<MyDataClass> m_myList;
      public ObservableCollection<MyDataClass> _myList
      {
         get
         {
             return m_myList;
         }
         set
         {
             m_myList = value;
             RaisePropertyChanged("_myList");
         }
      }

      public MainWindow()
      {
           InitializeComponent();
           _myList = new ObservableCollection<MyDataClass>();
           comboBox1.DataContext = _myList;
      }

      private void Button_Click(object sender, EventArgs e)
      {
           _myList = AnotherClass.SomeMethod();
      }

      public event PropertyChangedEventHandler PropertyChanged;
      public void RaisePropertyChanged(String _Prop)
      {
          if (PropertyChanged != null)
          {
              this.PropertyChanged(this, new PropertyChangedEventArgs(_Prop));
          }
      }
}

这是因为您实际上是在为属性分配值,而不是更新ObservableCollection。
因此需要将其视为属性,并且必须实现INotifyPropertyChanged。

顺便说一句,WCF DataContracts会自动实现INotifyPropertyChanged。

答案 1 :(得分:0)

好吧,你正在使用ObservableCollection,所以如果你不想实施INPC,那么你可以清除该集合并用新数据重新读回。确保在GUI线程上添加/删除ObservableCollection。您可能想看看Dispatcher的工作原理