我有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方法的情况下完成它?
答案 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文章。