通用行为

时间:2014-04-26 16:27:05

标签: wpf xaml generics behavior

我想创建通用行为。我的问题是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和   BAML形式的XAML目前不支持XAML 2009关键字和   特征

我找到了一些带有MarkupExtension的workaround,但行为不起作用。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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 包。