gpt4 book ai didi

wpf - 一般行为

转载 作者:行者123 更新时间:2023-12-05 07:59:00 25 4
gpt4 key购买 nike

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

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

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

In WPF and when targeting .NET Framework 4, you can use XAML 2009 features together with x:TypeArguments but only for loose XAML (XAML that is not markup-compiled). Markup-compiled XAML for WPF and the BAML form of XAML do not currently support the XAML 2009 keywords and features

我找到了一些 workaround使用 MarkupExtension 但使用 Behaviors 不起作用。

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

有什么想法吗?

最佳答案

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

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

关于wpf - 一般行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com