【问题标题】:Generic Behavior一般行为
【发布时间】:2021-03-23 03:46:41
【问题描述】:

我想创建通用行为。我的问题是 XAML 中的泛型声明。

    public class GenericBehavior<T> : Behavior<DataGrid>
        where T : class 
    {
    }

我不能使用x:TypeArguments,因为我没有松散的 XAML 文件。

在 WPF 和面向 .NET Framework 4 时,您可以使用 XAML 2009 与 x:TypeArguments 一起使用的功能,但仅适用于松散的 XAML(XAML 不是标记编译的)。用于 WPF 的标记编译 XAML 和 XAML 的 BAML 形式目前不支持 XAML 2009 关键字和 特点

我发现一些 workaround 带有 MarkupExtension 但行为不起作用。

在我目前的解决方案I attach behavior in code.

有什么想法吗?

【问题讨论】:

  • 为什么需要使用泛型行为?添加类型参数可能是一种解决方法?
  • @Didier:我想知道是否可以在没有复杂解决方法的情况下使用 XAML。
  • 一个更简单的解决方法可能是为您要使用的T 的每个具体实例创建一个具体的非泛型子类,即public class FooBehavior : GenericBehavior&lt;Foo&gt; {}

标签: wpf xaml generics behavior


【解决方案1】:

您可以在视图模型中创建通用行为,然后使用附加属性将其注入到您的控件中。

public class ViewModel
{
    public Behavior MyBehavior
    { 
        get 
        {
            return new GenericBehavior<SomeType>();
        } 
    }
}

public class AttachedBehaviors
{
    public static Behavior GetBehavior(DependencyObject sender) => (Behavior)sender.GetValue(BehaviorProperty);
    public static void SetBehavior(DependencyObject sender, Behavior value) => sender.SetValue(BehaviorProperty, value);

    public static readonly DependencyProperty BehaviorProperty =
        DependencyProperty.RegisterAttached("Behavior", typeof(Behavior), typeof(AttachedBehaviors),
            new PropertyMetadata(null, new PropertyChangedCallback(BehaviorChanged)));

    private static void BehaviorChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        if (sender is FrameworkElement elem)
        {
            if (e.NewValue is Behavior behavior)
            {
                BehaviorCollection Behaviors = Interaction.GetBehaviors(elem);
                Behaviors.Add(behavior);
            }
        }
    }

}

public class GenericBehavior<T> : Behavior<DataGrid> where T : class
{
    public T TestValue { get; set; }

    protected override void OnAttached()
    {
    }
}

现在你可以像这样使用它了

<DataGrid local:AttachedBehaviors.Behavior="{Binding MyBehavior}" > 
</DataGrid>

PS:你只需要安装Microsoft.Xaml.Behaviors.Wpf NuGet 包。

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2012-03-29
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多