WPF Обязательный вопрос - PullRequest
       4

WPF Обязательный вопрос

3 голосов
/ 25 февраля 2010

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

Пример 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());
    }

Можете ли вы объяснить мне, почему это может произойти сбой из-за 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 is null ...

Примечание: если я уберу вещь Messagebox, то привязка будет работать нормально, у меня есть значение в выпадающем списке. Это как если бы "некоторое" время потребовалось после установки datacontext. Но как узнать, когда будет сделано связывание?

Спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2010

Это потому, что выделенный выбор еще не сработал, поэтому выбранный элемент по-прежнему равен нулю.

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

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

0 голосов
/ 25 февраля 2010

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

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

0 голосов
/ 25 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...