我想创建通用行为。我的问题是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。
有什么想法吗?
答案 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 包。