使用ObservableCollection进行数据绑定

时间:2011-11-07 09:40:45

标签: wpf data-binding observablecollection

我有ComboBox

<ComboBox Height="23" HorizontalAlignment="Left" Margin="210,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding}" />

我希望他从另一个班级获取数据。

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

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

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

为什么这种方式不起作用?唯一的方法是写这样的东西:

private void Button_Click(object sender, EventArgs e)
    {
        _myList.Clear();
        foreach (var version in AnotherClass.SomeMethod())
        {
            _myList.Add(version);
        }
    }

或者我可以在不调用Add方法的情况下完成它?

2 个答案:

答案 0 :(得分:4)

WPF并非专为您设计,可以继续切换DataContext。它依赖于您坚持使用一个数据上下文,以及与其绑定的数据来实现INotifyPropertyChanged

因此,最好是绑定到复杂对象而不是直接绑定到数据。然后,您所要做的就是更新您的XAML绑定,添加在PropertyChanged上引发INotifyPropertyChanged事件的属性,然后您就完成了。在此之后,您不必直接在控件上设置绑定。

以下是我给出的另一个问题的答案,该问题最终会为该方法提供完整的教程:Trying to understand of DependencyProperty

这是开始使用您的代码执行此操作的一种方法,只需稍加更改:

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

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

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

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

    public PropertyChangedEvent PropertyChanged;

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

更新后的XAML:

<ComboBox Name="comboBox1" ItemsSource="{Binding MyList}"
          Width="120" Height="23"
          HorizontalAlignment="Left" VerticalAlignment="Top"
          Margin="210,12,0,0" />

答案 1 :(得分:1)

您需要使用INotifyPropertyChanged模式或DependecyProperty来通知绑定有关_myList的更改。

有关此模式的更多信息,请参阅this文章。