WPF ListBox按钮选定项

8

我有一个列表框,其中包含一些文本块和一个按钮,在按钮的代码后台中,它调用一个方法,传递当前选择的列表框项,这很好地解决了问题。问题在于,当我选择一个项目,然后单击另一个项目上的按钮时,它不会更新“SelectedItem”属性 - 是否有一种Xaml或C#的方式可以强制按钮单击选择父ListBoxItem?

Xaml


<DataTemplate>
    <Grid>
        <Button x:Name="myButton" Click="myButton_Click" Height="30" Width="30">
            <Image Source="Resources\Image.png" />
        </Button>
        <TextBlock Text="{Binding DataField}"></TextBlock>
    </Grid>
</DataTemplate>

所以每个ListBoxItem都有一个按钮和一个文本块?你能发布你的XAML或者给我们一个稍微更好的想法,这是如何设置的吗? - Charlie
3个回答

25
var curItem = ((ListBoxItem)myListBox.ContainerFromElement((Button)sender)).Content;

选择答案为简单起见。 - Nate
这适用于一系列的发送元素!我用它来处理(Grid)sender。 - Enrico
很棒的答案,我从未知道ContainerFromElement函数。 - antfx

4

当点击按钮时,它会将e.Handled设置为true,使路由事件遍历停止。

您可以向按钮添加处理程序来再次触发路由事件,或查找类型为ListBoxItem的可视祖先并将其IsSelected属性设置为true。

编辑

可以使用以下扩展方法:

public static DependencyObject FindVisualAncestor(this DependencyObject wpfObject, Predicate<DependencyObject> condition)
{
    while (wpfObject != null)
    {
        if (condition(wpfObject))
        {
            return wpfObject;
        }

        wpfObject = VisualTreeHelper.GetParent(wpfObject);
    }

    return null;
}

使用方法:

myButton.FindVisualAncestor((o) => o.GetType() == typeof(ListBoxItem))

这样的方法会是什么样子?我该如何找到按钮所在的ListBoxItem的可视祖先? - Nate

1

您可以将 ListBoxItem 传递给命令参数。

XAML:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Button Command="{Binding DataContext.DeleteItemCommand, ElementName=listBox}" CommandParameter="{Binding}"/>
    </DataTemplate>
</ListBox.ItemTemplate>

代码:

    public ICommand DeleteItemCommand => new RelayCommand(obj => DeleteItem(obj));
 
    private void DeleteItem(object obj)
    {
        if(obj is ItemName item)
            Items.Remove(item);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接