当点击ListBoxItem区域内的任何控件时,触发selecteindex改变

本文关键字:控件 触发 改变 selecteindex 任何 ListBoxItem 区域 | 更新日期: 2023-09-27 18:02:35

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

问题:在命令处理程序(这是绑定到按钮)我不能解决当前选择的项目/索引,因为它没有改变,而点击一个按钮或其他控件在一个ListBox项目,但当我点击ListBoxItem区域本身- SelectedIndex正在改变。

问题是如何触发selecteindex被改变,而单击ListBoxItem内的任何控件?

当点击ListBoxItem区域内的任何控件时,触发selecteindex改变

添加到您的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 ={绑定}

这将把当前项作为参数传递给命令,因此不需要跟踪所选项。