代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

WPF列表框按钮所选项目

  •  5
  • Nate CSS Guy  · 技术社区  · 15 年前

    我有一个带有一些文本块的列表框和一个按钮——在按钮的代码中,它调用了一个传递当前所选列表框项的方法,这非常有效。问题是,当我选择一个项目,然后单击另一个项目上的按钮时,它不会更新“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>
    
    2 回复  |  直到 15 年前
        1
  •  22
  •   rooks    15 年前
    var curItem = ((ListBoxItem)myListBox.ContainerFromElement((Button)sender)).Content;
    
        2
  •  4
  •   Fabrício Matté    15 年前

    单击按钮时,它会将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))