xaml - uwp 在样式中定义 eventriggerbehavior

标签 xaml uwp

我目前遇到一个问题。我想为我的所有 ListView 声明一个事件触发行为。这是我的代码:

<Style TargetType="ListView">
            <Setter Property="ItemTemplate" Value="{StaticResource itemShowTemplate}" />
            <i:Interaction.Behaviors>
                <Interactions:EventTriggerBehavior EventName="ItemClicked">
                    <Interactions:InvokeCommandAction Command="{Binding ShowItemClickedCommand}" />
                </Interactions:EventTriggerBehavior>
            </i:Interaction.Behaviors>
</Style>

我现在遇到的问题是EventTriggerBehavior正在寻找Style上的事件而不是Listview的目标类型。 EventTriggerBehavior 上唯一需要设置的属性是 SourceObject。但我不希望在 1 个 ListView 上出现这种行为,我希望在我的所有 ListView 上出现这种行为。

有办法做到这一点吗?

最佳答案

我的第一个想法是它可以这样工作:

<Style TargetType="Button">
    <Setter Property="i:Interaction.Behaviors">
        <Setter.Value>
            <i:BehaviorCollection>
                <core:EventTriggerBehavior EventName="Click">
                    <core:InvokeCommandAction Command="{Binding TestCommand}" />
                </core:EventTriggerBehavior>
            </i:BehaviorCollection>
        </Setter.Value>
    </Setter>
</Style>

但不幸的是,这仅适用于第一个附加行为的控件。原因是该值仅构造一次,并且 BehaviorCollectionAssociatedObject 属性设置为第一个控件。

然后我想到了这个解决方案 - How to add a Blend Behavior in a Style Setter 。 这个想法是创建一个附加属性,手动将行为分配给控件。

基于此我建议你这样做:

public static class ListViewBehaviorAttacher
{
    public static readonly DependencyProperty IsAttachedProperty = DependencyProperty.RegisterAttached(
        "IsAttached", typeof(bool), typeof(ListViewBehaviorAttacher), new PropertyMetadata(default(bool), IsAttachedChanged));

    private static void IsAttachedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        var listView = (ListView)dependencyObject;
        //create the binding
        BehaviorCollection collection = new BehaviorCollection();
        var eventTrigger = new EventTriggerBehavior() { EventName = "ItemClick" };
        var invokeCommandAction = new InvokeCommandAction();
        //binding to command
        BindingOperations.SetBinding(
            invokeCommandAction,
            InvokeCommandAction.CommandProperty,
            new Binding() { Path = new PropertyPath("ShowItemClickedCommand"), Source = listView.DataContext });
        eventTrigger.Actions.Add(invokeCommandAction);
        collection.Add(eventTrigger);
        listView.SetValue(Interaction.BehaviorsProperty, collection);
    }

    public static void SetIsAttached(DependencyObject element, bool value)
    {
        element.SetValue(IsAttachedProperty, value);
    }

    public static bool GetIsAttached(DependencyObject element)
    {
        return (bool)element.GetValue(IsAttachedProperty);
    }
}

然后在样式中将其附加如下:

<Style TargetType="ListView">
   <Setter Property="SelectionMode" Value="None"></Setter>
   <Setter Property="IsItemClickEnabled" Value="True" /> 
   <Setter Property="local:ListViewBehaviorAttacher.IsAttached" Value="True" />
</Style>

关于xaml - uwp 在样式中定义 eventriggerbehavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39051600/

相关文章:

c# - UWP - 旋转图像,同时保持其与网格对齐,仅使用 XAML

xaml - 如何向 UWP 中的 MenuFlyout 添加图标?

c# - UWP TextBox puts\r only - 如何设置 LineBreak

c# - UWP XAML 编辑器不起作用

c++ - C++ 应用程序中的 Azure 通知中心?

c++ - 如何编写异步操作?

c# - 单击RadioButton,第二个radioButton不会取消标记wpf

c# - 在 Windows 8 商店应用程序上以编程方式将椭圆放置在 Canvas 上

c# - 如何将 MainWindow.xaml 拆分为单独的文件? - 外包<Style>?

c# - XAML ObjectDataProvider,对象类型错误