Selectedititem в исключении нулевой ссылки со списком

Я хочу использовать SelectedItem, чтобы установить выбор в поле со списком из кода. Я могу заставить его работать только с помощью SelectedValue. SelectedItem вызовет исключение нулевой ссылки с этим в верхней части трассировки стека:

в AttachedCommandBehavior.CommandBehaviorBinding.Execute()

XAML:

<Window x:Class="MainWindowView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:acb="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior"
Title="Window1" Height="300" Width="300">
<StackPanel>
    <ComboBox Name="ComboItems1"
              DisplayMemberPath="Value" 
              SelectedValuePath="Key"
              ItemsSource="{Binding Items}" 
              SelectedValue="{Binding SelectedValue}" 
              acb:CommandBehavior.Event="SelectionChanged" 
              acb:CommandBehavior.Command="{Binding Path=SelectionChangedCommand}" 
              acb:CommandBehavior.CommandParameter="{Binding ElementName=ComboItems1, Path=SelectedItem}" />

    <ComboBox Name="ComboItems2"
              DisplayMemberPath="Value" 
              SelectedValuePath="Key"
              ItemsSource="{Binding Items}" 
              SelectedItem="{Binding SelectedItem}" 
              acb:CommandBehavior.Event="SelectionChanged" 
              acb:CommandBehavior.Command="{Binding Path=SelectionChangedCommand}" 
              acb:CommandBehavior.CommandParameter="{Binding ElementName=ComboItems2, Path=SelectedItem}"/>
</StackPanel>

The code:

Imports AttachedCommandBehavior

Открытый класс MainWindowViewModel

Private _mainWindowView As MainWindowView

Public Property Items As New List(Of KeyValuePair(Of Integer, String))
Public Property SelectedItem As Nullable(Of KeyValuePair(Of Integer, String))
Public Property SelectedValue As Nullable(Of Integer)
Public Property SelectionChangedCommand As ICommand

Public Sub New()

    Items.Add(New KeyValuePair(Of Integer, String)(1, "first item"))
    Items.Add(New KeyValuePair(Of Integer, String)(2, "second item"))
    Items.Add(New KeyValuePair(Of Integer, String)(3, "third item"))

    Dim simpleCommand As SimpleCommand = New SimpleCommand()
    simpleCommand.ExecuteDelegate = Sub(selectedItem As Object)
                                        HandleSelectionChanged(selectedItem)
                                    End Sub
    SelectionChangedCommand = simpleCommand

    SelectedValue = 1
    'SelectedItem = Items(1) 'uncomment this to raise the null ref exception

End Sub

Private Sub HandleSelectionChanged(ByRef selectedItem As Object)
    If selectedItem IsNot Nothing Then
        'Do something
    End If
End Sub

Конец класса

Почему выбранный элемент не работает?

ОБНОВЛЕНИЕ:

Николай: у тебя зоркий глаз. Это произошло из-за того, что в последнюю минуту копировалась вставка!

Blindmeis: это, конечно, абстракция от гораздо большей программы, в которой мне нужно событие selectionchanged для выполнения некоторых действий. Эти привязки команд должны остаться (хотя, возможно, их нужно исправить).

С уважением,

Мишель


person Michel van Engelen    schedule 20.04.2012    source источник
comment
Попробуйте изменить закомментированную строку на SelectedValue = 2 У меня такое ощущение, что это привязка вашего события к SelectionChanged   -  person Jason Ridge    schedule 20.04.2012
comment
когда когда-нибудь ваш seleteditem меняет выбор, чтобы вы могли все обрабатывать в своей виртуальной машине без команд? или я что-то пропустил?   -  person blindmeis    schedule 20.04.2012
comment
ExitMusic: я хочу, чтобы он работал с SelectedItem, и я демонстрирую, что SelectedValue работает, а SelectedItem — нет. SelectedItem используется в ComboItems2.   -  person Michel van Engelen    schedule 20.04.2012
comment
Blindmeis, правильно: привязка команды позволяет мне обрабатывать событие selectionchanged непосредственно в модели представления без необходимости выполнять сантехнику в представлении.   -  person Michel van Engelen    schedule 20.04.2012


Ответы (2)


почему у вас есть эти привязки команд?

    <ComboBox 
          DisplayMemberPath="Value" 
          SelectedValuePath="Key"
          ItemsSource="{Binding Items}" 
          SelectedItem="{Binding SelectedItem}" />

модель просмотра

    //this select the "third item" in your combobox
    SelectedItem = Items[2];/dont know the vb indexer stuff ;)

это работает.

Редактировать:

модель просмотра

     public KeyValuePair<int, string> SelectedItem
     {
        get{return this._selectedItem;}
        set{

           if(this._selectedItem==value)
               return;//no selection change

           //if you got here then there was a selection change
           this._selectedItem=value;
           this.OnPropertyChanged("SelectedItem");
           //do all action you want here
           //and you do not need selection changed event commmandbinding stuff

         }
     }      
person blindmeis    schedule 20.04.2012
comment
Я не думал об этом, это, безусловно, приемлемо. Я подниму событие от сеттера. Если кто-то знает, почему возникает первоначальная проблема, пожалуйста, дайте мне знать :). - person Michel van Engelen; 20.04.2012
comment
вы уже вызываете событие в своем установщике :) INotifyPropertyChanged! - person blindmeis; 20.04.2012

acb:CommandBehavior.CommandParameter="{Binding ElementName=ComboItems, Path=SelectedItem}"

У вас нет элемента с именем ComboItems, у вас есть ComboItems1 и ComboItems2. Я думаю, что это проблема.

person Nikolay    schedule 20.04.2012