我有一个带有ItemTemplate的ListBox,其中包含与鼠标交互的控件。这会干扰列表框的选择功能,即单击控件不会选择该项目。这是因为ListBoxItem在OnMouseLeftButtonDown中将鼠标事件的Handled属性设置为true。我尝试了以下

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    e.Handled = false;
}


但是ListBoxItem会“接管”鼠标,并阻止控件进行自己的交互。然后我有了另一个主意

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    ((ListBoxItem)VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(this)))).IsSelected = true;
}


确实有效,但感觉更像是丑陋的丑闻,而不是优雅的解决方案。有没有不依赖视觉树确切内容的更好的解决方案?

最佳答案

我发现了一种不太费劲的方法:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    Selector.SetIsSelected(this, true);
}


为了使其生效,ListBox的ItemTemplate中的控件需要以下XAML属性:

Selector.IsSelected="{Binding IsSelected, Mode=OneWayToSource, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"


它提出了两个新问题:


定义我自己的依赖项属性,而不是找到当前未使用的附加属性,会更好吗?
有没有办法仅在标记中实现类似的功能?

09-30 14:14
查看更多