我开始使用WPF和绑定,但有一些我不理解的奇怪行为。
例1: 一个非常简单的WPF表单,在构造函数中只有一个组合框(name = C)和以下代码:
public Window1()
{
InitializeComponent();
BindingClass ToBind = new BindingClass();
ToBind.MyCollection = new List<string>() { "1", "2", "3" };
this.DataContext = ToBind;
//c is the name of a combobox with the following code :
//<ComboBox Name="c" SelectedIndex="0" ItemsSource="{Binding Path=MyCollection}" />
MessageBox.Show(this.c.SelectedItem.ToString());
}
你能解释一下为什么会崩溃,因为this.c.SelectedItem为NULL。
所以我虽然......没问题,因为它在构造函数中,让我们把代码放在Loaded表单事件中:
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
BindingClass ToBind = new BindingClass();
ToBind.MyCollection = new List<string>() { "1", "2", "3" };
this.DataContext = ToBind;
MessageBox.Show(this.c.SelectedItem.ToString());
}
同样的问题this.c.SelectedItem为null ...
备注:如果我删除了Messagebox的东西,那么绑定工作正常,我在组合框中有值。就像在设置datacontext之后需要“一些”时间一样。但是如何知道绑定何时完成?
请你帮忙。
答案 0 :(得分:2)
这是因为selectionchanged尚未触发,因此selecteditem仍为空。
private void c_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
MessageBox.Show(this.c.SelectedItem.ToString());
}
如果您不熟悉WPF,我建议您去看看MVVM模式。这里有一个非常好的介绍视频:http://blog.lab49.com/archives/2650
答案 1 :(得分:0)
您的绑定发生在Window_Loaded事件期间,但它不会被scren吸引,因此还没有SelectedItem。
您必须收听Binding或DataContext的PropertyChanged事件或其他内容。然后OnPropertyChanged,调出你的消息框
答案 2 :(得分:0)
评论的Tx,它应该是这样的,我试试这个,这是有效的:
BindingClass ToBind = new BindingClass();
public Window1()
{
InitializeComponent();
ToBind.MyCollection = new List<string>() { "1", "2", "3" };
this.DataContext = ToBind;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
MessageBox.Show(this.c.SelectedItem.ToString());
}
所以在这里,即使它没有在屏幕上绘制,也已经提取了选择项......非常奇怪。