Wpf 一般行为

Wpf 一般行为,wpf,xaml,generics,behavior,Wpf,Xaml,Generics,Behavior,我想创建通用行为。我的问题是XAML中的泛型声明 public class GenericBehavior<T> : Behavior<DataGrid> where T : class { } 公共类泛型行为:行为 T:在哪里上课 { } 我不能使用,因为我没有松散的XAML文件 在WPF和针对.NETFramework4时,可以使用XAML2009 与x:TypeArguments一起使用的特性,但仅适用于松散的XAML(

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

    public class GenericBehavior<T> : Behavior<DataGrid>
        where T : class 
    {
    }
公共类泛型行为:行为
T:在哪里上课
{
}
我不能使用,因为我没有松散的XAML文件

在WPF和针对.NETFramework4时,可以使用XAML2009 与x:TypeArguments一起使用的特性,但仅适用于松散的XAML(XAML 这不是标记(已编译)。为WPF和 XAML的BAML表单目前不支持XAML 2009关键字和 特征

我发现一些具有MarkupExtension,但行为不起作用

在我当前的解决方案中


有什么想法吗?

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

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()
    {
    }
}
公共类视图模型
{
公众行为我的行为
{ 
得到
{
返回新的GenericBehavior();
} 
}
}
公共类附加行为
{
公共静态行为GetBehavior(DependencyObject sender)=>(行为)sender.GetValue(行为属性);
public static void SetBehavior(DependencyObject发送者,行为值)=>sender.SetValue(BehaviorProperty,值);
公共静态只读从属属性行为属性=
DependencyProperty.RegisterAttached(“行为”)、typeof(行为)、typeof(附加行为),
新PropertyMetadata(null,新PropertyChangedCallback(BehaviorChanged));
私有静态无效行为已更改(DependencyObject发件人、DependencyPropertyChangedEventArgs e)
{
if(发送方为FrameworkElement元素)
{
if(例如,NewValue是行为)
{
BehaviorCollection行为=Interaction.GetBehaviors(elem);
添加(行为);
}
}
}
}
公共类GenericBehavior:行为,其中T:类
{
公共T测试值{get;set;}
受保护的覆盖无效附加()
{
}
}
现在你可以这样使用它了

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


PS:您只需要安装
Microsoft.Xaml.Behaviors.Wpf
NuGet软件包。

为什么需要使用通用行为?添加类型参数可能是一种变通方法?@Didier:我想知道是否可以在XAML中进行,而不需要复杂的变通方法。一种更简单的变通方法可能是为您要使用的
T
的每个具体实例创建一个具体的非泛型子类,即
公共类FooBehavior:GenericBehavior{}