Wpf 一般行为
我想创建通用行为。我的问题是XAML中的泛型声明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(
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{}
。