2011-07-13 7 views
3

ListBoxItemのデータテンプレートがあり、グリッドやチャートのようなカスタムコントロールはほとんどありません。各ボタンは適切なコマンドハンドラにバインドされ、ListViewコントロールのSelectedIndexプロパティはViewModelのプロパティにもバインドされます。ListBoxItemエリア内の任意のコントロールをクリックしている間に、SelectedIndexがトリガーされました。

問題:それは、ボタンやリストボックスの項目内の他のコントロールをクリックしながら変化するが、時にされていないので(ボタンにバインドされている)コマンドハンドラで、私は現在選択されている項目/インデックスを解決することはできません私はListBoxItemエリア自体をクリックしています - SelectedIndexが変化しています。

Questionは ListBoxItem内の任意のコントロールをクリックしながらSelectedIndexを変更する方法を教えてください。

+1

Buttonオブジェクトの親をListBoxItemとして取得し、そのインデックスを確認できませんか? – vrrathod

+0

クリックしたアイテムを見つけ出すだけで、実際には選択したアイテムを変更する必要はありません。あなたがあなたのコードをより良く構造化したら、SelectedIndexをまったく使用する必要はありません。 –

答えて

6

:(キーボードが自動的にすぎ項目を選択して...、この例では問題になるはずのちょうどマウスフォーカス、)これは、子要素のすべての種類の

例を働きますあなたの​​

<ListBox.Resources> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Style.Triggers> 
      <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
       <Setter Property="IsSelected" Value="True" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ListBox.Resources> 

EDIT

は、従来の方法では唯一のListBoxItemを作りますキーボードフォーカスがある限り選択されます。フォーカスをListBoxItemから移動すると、フォーカスが再び選択解除されます。

ここでアイテム内のキーボードフォーカスが移動するリストボックスの項目を選択するための別の簡単な方法だと、フォーカスが

protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    ListBoxItem item = (ListBoxItem)sender; 
    item.IsSelected = true; 
} 
の後ろListBoxItem

<Style TargetType="{x:Type ListBoxItem}"> 
    <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/> 
</Style> 

、コード内の外に移動したとき、それは選択されたまま

+0

私はこの解決策を試みました。同様の問題です。項目は正しく強調表示されていますが、listbox.selectedItemにアクセスしようとするとnullに設定され、selectedindexは-1です。S – Marcom

+0

@Marcomあなたは正しいです、私は気づいたことはありません。私はまだかなり簡単ですが、SelectedIndex/Itemを更新しました。 – Rachel

+0

レイチェルありがとう、これは私が探しているものです – sll

1

バインドされたコマンドで選択したアイテムとしてアイテムを設定できませんか?あなたのリストItem viewmodelがListBoxes viewmodelにアクセスできる場合は、そこにバインドしたプロパティを設定することができます。

Private Sub ButtonClickExecute() 
    ListBoxVM.SelectedItem = Me.MyModelItem 
End Sub 

限りのSelectedItemバウンドプロパティは、リード/ライトされると、私は機会にこれを行っている、それは非常によく働いている、PropertyChangeNotificationが働いています。

ViewModelとModelがこれをサポートしていない場合は、私に教えてください。別の方法で試すことができます。

おっと、すぐにC#タグに気付かなかった。それは次のようになります。

ListBoxVM.selectedItem = this.myModelItem; 
+0

本当に私はコマンドハンドラで項目を選択していないので、SelectedIndexを使って選択した項目にアクセスして処理しています。コードなしでxamlでそれを行うことができればそれは可能ですが、これは制限ではありません – sll

+0

ボタンがバインドされているコマンドは、ListViewItemのViewModelの右側にありますか?その場合は、ListViewのViewModel SelectedItemバウンドプロパティにView(ListViewItem)を渡して、アイテムを選択したものに設定できるようにする必要があります。ボタンをクリックすると、選択されている項目がわかります。それはListViewに伝えるだけです。ボタンからListViewItemへのフォーカスをトリックルドダウンして選択自体を処理する方法はありますが、どのように見つけたかはわかりませんでしたので、このメソッドを採用しました。うまく動作し、シンプルで、多くのものに使用できます。 – CodeWarrior

+0

ListViewItems以外のViewModelにあるボタンコマンドのバインディングについて話していますか? – CodeWarrior

1

XAMLのみのソリューション:

あなたはItemContainerStyleを適応し、トリガがmousefocusは、項目の中であるに聴くことができます。これを追加

<Grid> 
    <Grid.Resources> 
     <x:Array x:Key="strings" Type="sys:String" > 
     <sys:String>test</sys:String> 
     <sys:String>test</sys:String> 
     <sys:String>test</sys:String> 
     <sys:String>test</sys:String> 
     </x:Array> 
     <Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">  
     <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
      <ContentPresenter /> 
      </DataTemplate> 
     </Setter.Value> 
     </Setter> 
     <Style.Triggers>   
     <Trigger Property="IsKeyboardFocusWithin" Value="True">   
     <Setter Property="IsSelected" Value="True" /> 
     </Trigger>  
     </Style.Triggers> 
     </Style> 
    </Grid.Resources> 
    <ListBox ItemsSource="{Binding Source={StaticResource strings}}" ItemContainerStyle="{StaticResource ContainerStyle}" > 
    <ListBox.Resources> 
    <DataTemplate DataType="x:Type ListBoxItem"> 
    <ListBoxItem IsSelected="{Binding IsKeyboardFocusWithin}" /> 
    </DataTemplate> 

    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Button Content="{Binding}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
    </ListBox> 
    </Grid> 
+0

このXAMLを使用してマウスの左クリックを処理する方法は? – sll

+0

する必要はありません。あなたがボタンをクリックすると、keyboardfocusはアイテム内のボタンに設定され、アイテムが選択されるようになります。 – fixagon

1

データテンプレートの下にあるアイテムだけに興味がある場合は、バインディングを引数として持つCommandParameterを使用できます。

CommandParameter = {バインディング}

これは、コマンドのパラメータ、そう選択したアイテムを追跡する必要がないように、現在のアイテムを通過します。

関連する問題