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

标签 c# xaml windows-runtime

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

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

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

我不确定要在此处显示什么代码,因为就像我说的那样,除了按钮之外的所有内容都适用于样式,并且除了视觉状态处理之外,所有内容都适用于用户控件。

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

[更新]

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

<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 中的东西。

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

最佳答案

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

  • The properties you use as binding source properties for a binding must be public properties of your class. Explicitly defined interface properties cannot be accessed for binding purposes, nor can protected, private, internal, or virtual properties that have no base implementation.
  • You cannot bind to public fields.

引用资料:

关于c# - 如何将功能按钮添加到 UWP XAML 中的列表框项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41951359/

相关文章:

c# - makepri.exe 是如何集成到 MSBuild 中的?

c# - 以编程方式单击 MessageBox 按钮

c# - 使用 Array.Foreach 和 lambda 表达式修改数组

c# - 验证 System.DateTime 是 UTC 格式

c# - XAML 的编译器参数?

c++ - 如何定位 WinRT 异步方法调用中出现错误的位置?

c# - Windows 8 网格应用程序中的自定义详细信息页面

c# - 如何将 List<string> 绑定(bind)到 ItemsControl?

c# - 在 App Lauch 中将 JSON 对象反序列化为 ObservableCollection<T> 并将其绑定(bind)到 MVVM(模板 10)中的 GridView 或 ListView

c# - HttpClient HttpResponseMessage 地址/URI