2012-04-20 2 views
0

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

на 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> 

Кодекса :

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 

End Class

Почему SelectedItem не работает?

UPDATE:

Николай: у вас есть острый глаз. Это было связано с последней копией пасты!

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

С уважением,

Мишель

+0

Попробуйте изменить закомментирована линию 'SelectedValue = 2' я связывании чувство его ваше мероприятие на SelectionChanged –

+0

, когда все ваши seleteditem изменить изменения выбора так что вы все можете справиться в своем vm без командования? или я что-то пропустил? – blindmeis

+0

ExitMusic: Я хочу, чтобы он работал с SelectedItem, и я демонстрирую, что SelectedValue работает, но SelectedItem нет. SelectedItem используется в ComboItems2. –

ответ

3

Почему у вас есть эти команды?

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

ViewModel

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

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

Edit:

ViewModel

 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 

     } 
    }  
+0

Я не думал об этом, это, безусловно, приемлемо. Я вызову событие из сеттера. Если кто-то знает, почему возникает первоначальная проблема, сообщите мне об этом :). –

+0

вы уже делаете событие в своем сеттере :) INotifyPropertyChanged! – blindmeis

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

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

Смежные вопросы