0

SelectedItemを使用して、コードからコンボボックスに選択を設定したいと思います。SelectedValueを使用することによってのみ機能させることができます。SelectedItemは、スタックトレースの先頭にこれを含むnull参照例外をスローします。

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

エンドクラス

selecteditemが機能しないのはなぜですか?

アップデート:

ニコライ:あなたは鋭い目を持っています。ギリギリのコピー&ペースト作業によるものです!

Blindmeis:もちろん、これは、いくつかのアクションを実行するためにselectionchangedイベントが必要なはるかに大きなプログラムからの要約です。これらのコマンドバインディングはそのままにしておく必要があります(ただし、修正が必要な場合があります)。

よろしく、

ミシェル

4

2 に答える 2

3

なぜこれらのコマンドバインディングがあるのですか?

    <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

         }
     }      
于 2012-04-20T10:39:47.297 に答える
1
acb:CommandBehavior.CommandParameter="{Binding ElementName=ComboItems, Path=SelectedItem}"

ComboItemsという名前の要素はなく、ComboItems1とComboItems2があります。これが問題だと思います。

于 2012-04-20T10:39:36.467 に答える