2010-02-25 4 views
3

Я начинаю с WPF и привязки, но есть странное поведение, которое я не понимаю.WPF Binding question

Exemple 1: Очень простая форма WPF, только один выпадающий список (имя = 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()); 
    } 

Можете ли вы объяснить мне, почему это приведет к краху из-за этого. c.SelectedItem - NULL.

Так что, хотя ... не проблема, это потому, что в конструкторе, не давайте код в виде нагруженного события:

 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 равна нулю ...

Примечание. Если я удалю объект Messagebox, то работа с привязкой прекрасна, у меня есть значение в поле со списком. Это похоже на то, что после того, как задан datacontext, потребуется некоторое время. Но как узнать, когда будет выполняться привязка?

Tx вы за свою помощь.

ответ

2

Это потому, что selectionchanged еще не активирован, поэтому selectitem по-прежнему null.

private void c_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    MessageBox.Show(this.c.SelectedItem.ToString()); 
} 

Если вы новичок в WPF, я предлагаю вам взглянуть на шаблон MVVM. Существует очень хорошее введение видео здесь: http://blog.lab49.com/archives/2650

+0

Ад, на самом деле это даже больше, чем только выбранный, то есть null. Комбобокс реагирует так же, как если бы он не был привязан вообще (элементы также имеют значение null). Было любопытно, потому что это работает в silverlight 3 – Fabian

+0

Да, не удосужился проверить это: P. Приятно, что он работает в silverlight, но не в wpf. Возможно, у них есть другой способ загрузки элементов управления. Я проверил OnContentRendered и MyCollection был установлен до того, как он отобразит сам элемент управления. У меня нет времени, чтобы взглянуть на него больше, но красный рефлектор .net - отличный инструмент для изучения того, что происходит в рамках .net. Помог мне найти много странных вещей с WPF. Извините за неправильный ответ, но я надеюсь, что вы посмотрите на MVVM как на очень хороший образец для разработки приложений WPF. – Michael

+0

Tx you Michael, я перемещаю проектную форму silverlight 3 в WPF, на первый взгляд кажется, что это довольно легко, но они действительно неприятные странные различия между ними, которые делают вещь довольно сложной! :) – Fabian

0

Ваше связывание происходит во время события Window_Loaded, но оно не нарисовано для scren, так что пока еще нет SelectedItem.

Вам нужно будет прослушать событие PropertyChanged вашего Binding или DataContext или что угодно. Затем OnPropertyChanged, поднимите свой ящик сообщений

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

Так вот, даже если это не так Нарисованный на экране выбранный элемент уже выписан ... очень странно.