当点击ListBoxItem区域内的任何控件时,触发selecteindex改变
本文关键字:控件 触发 改变 selecteindex 任何 ListBoxItem 区域 | 更新日期: 2023-09-27 18:02:35
我有一个ListBoxItem的数据模板,它包含几个按钮,和一些自定义控件,如网格或图表。每个按钮都被绑定到一个适当的命令处理程序,ListView控件的SelectedIndex属性也被绑定到ViewModel的属性。
问题:在命令处理程序(这是绑定到按钮)我不能解决当前选择的项目/索引,因为它没有改变,而点击一个按钮或其他控件在一个ListBox项目,但当我点击ListBoxItem区域本身- SelectedIndex正在改变。
问题是如何触发selecteindex被改变,而单击ListBoxItem内的任何控件?
添加到您的ListBox.Resources
<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>
编辑
上一个方法只在ListBoxItem具有键盘焦点时才使其被选中。如果您将焦点移出ListBoxItem,它将再次变为未选中。
这是另一种简单的方法,当键盘焦点移动到ListBox项内时选择该项,并且当焦点移出ListBoxItem时保持选中
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
</Style>
和
背后的代码protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
ListBoxItem item = (ListBoxItem)sender;
item.IsSelected = true;
}
是否可以在绑定命令中将项设置为选中项?如果你的list Item视图模型可以访问ListBoxes视图模型,你应该能够设置你在那里绑定的属性。
Private Sub ButtonClickExecute()
ListBoxVM.SelectedItem = Me.MyModelItem
End Sub
我偶尔这样做过,它工作得很好,只要SelectedItem绑定属性是读/写的,PropertyChangeNotification就可以工作。
如果你的ViewModel和Model不支持这个,告诉我,我们可以尝试另一种方法。
哎呀,没有立即注意到c#标签。应该是:
ListBoxVM.selectedItem = this.myModelItem;
仅限xml的解决方案:
你可以调整ItemContainerStyle,当鼠标焦点在Item内部时监听触发器。它适用于所有类型的子元素(在这个例子中只有鼠标焦点,这应该不是问题,因为键盘也会自动选择项目…)
的例子:
<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>
如果您只对数据模板下面的项感兴趣,您可以使用带有绑定作为参数的CommandParameter。
CommandParameter ={绑定}
这将把当前项作为参数传递给命令,因此不需要跟踪所选项。