单击ListBoxItem区域内的任何控件时触发SelectedIndex已更改

我有一个ListBoxItem的数据模板,它包含几个按钮,以及很少的自定义控件,如网格或图表。 每个按钮都绑定到一个合适的命令处理程序,ListView控件的SelectedIndex属性也绑定到ViewModel的属性。

问题 :在命令处理程序(绑定到按钮)中我无法解析当前选定的项目/索引,因为它在单击ListBox项目中的按钮或其他控件时没有改变,但是当我单击ListBoxItem区域本身时 – SelectedIndex正在改变。

问题是如何在单击ListBoxItem中的任何控件时触发SelectedIndex更改?

将其添加到ListBox.Resources

    

编辑

只要具有键盘焦点,前一种方法仅选择ListBoxItem。 如果将焦点移出ListBoxItem,它将再次被取消选中。

这是键盘焦点在项目中移动时选择ListBox项目的另一种简单方法,当焦点移出ListBoxItem时它保持选中状态

  

而在守则背后

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

您是否可以将项目设置为绑定命令中的选定项目? 如果列表Item viewmodel可以访问ListBoxes视图模型的任何内容,那么您应该能够设置绑定在那里的属性。

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

我偶尔也这样做了,它运行得很好,只要SelectedItem绑定属性是读/写,PropertyChangeNotification就可以了。

如果您的ViewModel和Model不支持此function,请告诉我们,我们可以尝试其他方式。

哎呀,没有马上注意到C#标签。 那应该是:

 ListBoxVM.selectedItem = this.myModelItem; 

仅限XAML的解决方案:

您可以调整ItemContainerStyle并在触发器上侦听鼠标焦点在Item内部。 它适用于所有类型的子元素(在这个例子中只是鼠标焦点,这不应该是一个问题,因为键盘也会自动选择项目……)

例:

     test test test test                 

如果您只对数据模板下面的项目感兴趣,可以使用带有绑定作为参数的CommandParameter。

CommandParameter = {}绑定

这会将当前项目作为参数传递给命令,因此无需跟踪所选项目。