【问题标题】:WPF ListBox Button Selected ItemWPF ListBox 按钮选定项
【发布时间】:2009-07-16 20:10:47
【问题描述】:

我有一个带有一些文本块和一个按钮的列表框——在按钮的代码隐藏中,它调用一个方法来传递当前选定的列表框项,这很好用。问题是,当我选择一个项目然后单击另一个项目上的按钮时,它不会更新“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 或让我们稍微了解一下这是如何设置的?

标签: c# .net wpf listbox


【解决方案1】:
var curItem = ((ListBoxItem)myListBox.ContainerFromElement((Button)sender)).Content;

【讨论】:

  • 为简单起见选择作为答案。
  • 这适用于一系列发件人元素!用于(网格)发件人。
  • 很好的答案,永远不会知道 ContainerFromElement 函数
【解决方案2】:

单击按钮时,它会将 e.Handled 设置为 true,从而导致路由事件遍历停止。

您可以将处理程序添加到再次引发路由事件的 Button,或者找到 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 的视觉祖先?
【解决方案3】:

您可以将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);
    }

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多