如何将功能按钮添加到 UWP XAML 中的列表框项

Posted

技术标签:

【中文标题】如何将功能按钮添加到 UWP XAML 中的列表框项【英文标题】:How do I add a functioning button to a listboxitem in UWP XAML 【发布时间】:2017-06-16 12:32:19 【问题描述】:

我有一个带有 ListBox 的 UWP C# 应用程序。我将 ListBox ItemContainerStyle 属性设置为资源中的样式。我试图在样式中向 ControlTemplate 添加一个按钮。我不知道在哪里添加 Clicked 或 tapped 事件处理程序。

我将代码转换为使用直接添加到列表中的 UserControl,它工作得很好,只是 VisualStateManager 在 UserControl 中不起作用。

所以我可以获得一个带有 UserControl 代码隐藏的功能按钮,我可以让 VisualStateManager 工作并处理我的 ListBoxItem 选择的自定义可视化,但我无法获得视觉状态以及功能按钮。

我不确定这里要显示什么代码,因为就像我说的那样,除了按钮之外的所有内容都可以与样式一起正常工作,并且除了视觉状态处理之外,所有内容都可以与用户控件一起正常工作。

我已经阅读了我能找到的所有关于这个的问题,我能找到的最接近的方法是为按钮提供一个处理函数,但没有人说要将它添加到哪个类;他们只是在任何情况下单独显示功能。视觉状态处理似乎总是需要开发人员检测鼠标悬停、选择等...,在代码中处理状态,每个状态都有一个处理程序来检测,然后调用 GoToState 来让视觉状态管理器去做它的东西。必须有一种方法可以做到这一点,而无需所有这些旋转和额外且看似冗余的代码。

[更新]

我目前正在通过设置 ItemContainerStyle 为 ListBoxItem 使用样式。此外,我正在尝试绑定新添加的 Button 的 Command 参数。它不起作用。这是该样式的 XAML,只显示了重要部分(因为除了按钮之外,它都按预期工作)。这显示了两个文本框和按钮。重要的是要注意 TextBox 元素的 Text 属性的绑定工作正常,并且文本完全按预期显示。这让我想假设绑定源和路径的东西都设置正确。但是再一次,我被挫败了,因为 Command 绑定不起作用,并且在构建或运行时没有报告错误:

<StackPanel Background="Transparent" Margin="0,0,0,0">
    <TextBlock FontSize="22" TextWrapping="Wrap" FontWeight="SemiLight" x:Name="Title" Text="Binding Title" Margin="12,4,24,6" Visibility="Binding Title, Converter=StaticResource StringToVisibiltyConverter" Foreground="Binding color"/>
    <TextBlock TextWrapping="Wrap" Visibility="Binding SubTitle, Converter=StaticResource StringToVisibiltyConverter" x:Name="Subtitle" Text="Binding SubTitle" Margin="12,-6,24,6" Opacity="0.8" Foreground="Binding color"/>
    <Button Command="Binding ClickCommand" CommandParameter="x">X</Button>
</StackPanel>

这是我添加到 ListBox 的对象的代码:

public class MultilineListboxItem : Object

    public MultilineListboxItem()  ClickCommand = new _ClickCommand(); 

    public string Title  get; set; 
    public string SubTitle  get; set; 
    public string Original  get; set; 
    public override string ToString()  return Original; 
    public SolidColorBrush color  get; set; 

    _ClickCommand ClickCommand;

当然还有 _ClickCommand 类定义:

public class _ClickCommand : ICommand

    public void Execute(object parameter)
    
        Diagnostics.AppendDiagnostic( "derf" );
    


    public bool CanExecute(object parameter)
    
        Diagnostics.AppendDiagnostic( "derf" );
        return true;
    

    public event EventHandler CanExecuteChanged;

这些是我自己的诊断报告函数,不是 C# 或 WinRT 中的。

现在我又回到了使用样式来定义列表项的外观,视觉状态都按预期工作。

【问题讨论】:

【参考方案1】:

尝试将ClickCommand 更改为公共属性。

用作绑定的绑定源属性的属性必须是类的公共属性。明确定义的接口 不能出于绑定目的访问属性,也不能受保护, 没有基础的私有、内部或虚拟属性 实施。 您不能绑定到公共字段。

参考:

https://***.com/a/19704292/3869284 https://msdn.microsoft.com/en-us/library/ms743643.aspx?f=255&MSPPError=-2147217396

【讨论】:

只想指出,如果您使用x:Bindprivate 也可以。

以上是关于如何将功能按钮添加到 UWP XAML 中的列表框项的主要内容,如果未能解决你的问题,请参考以下文章

将 CommandBar 添加到 xaml UWP 中当前歌曲列表的顶部。多次设置“内容”属性

将列表框选定的项目发送到不同 uwp 页面上的另一个列表框

具有多边形形状的 XAML UWP 按钮

在带有文本框的列表框中,如何关注添加的文本框?

UWP Xaml将属性绑定到splitview中的其他页面

UWP 应用程序 - 将 SQL 表中的数据显示到数据网格或列表框