WPF绑定问题

时间:2010-02-25 19:04:30

标签: c# wpf data-binding binding

我开始使用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之后需要“一些”时间一样。但是如何知道绑定何时完成?

请你帮忙。

3 个答案:

答案 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());
    }

所以在这里,即使它没有在屏幕上绘制,也已经提取了选择项......非常奇怪。