如何在后面的代码中添加 WPF Behavior
How to add WPF Behavior in the code behind
我正在尝试找到一种在代码中添加行为的方法,我能够在 XAML 中成功添加它。
这就是我将 XAML 中的行为添加到网格的方式,SelectedItems 是行为中的一个 DP,它是数据绑定到视图模型选定项 属性。我正在监听网格集合更改事件并更新 DP,DP 反过来通知所选项目的视图模式
/// <summary>
/// Dependency Property SelectedItems
/// </summary>
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register("SelectedItems",
typeof(INotifyCollectionChanged), typeof(MultiSelectBehavior),
new PropertyMetadata(null));
AssociatedObject.SelectedItems.CollectionChanged += GridSelectedItems_CollectionChanged;
<i:Interaction.Behaviors>
<behaviors:MultiSelectBehavior SelectedItems="{Binding SelectedItems}"/>
</i:Interaction.Behaviors>
我需要的是在后面的代码中创建这个行为。我在包含网格的 window 的构造函数中执行此操作,但它不起作用,视图模型选择的项目 属性 没有得到更新。
var multiSelectBehavior = new MultiSelectBehaviorSingleton();
BindingOperations.SetBinding(this.BackupsGrid, MultiSelectBehavior.SelectedItemsProperty,
new Binding()
{
Source = this.DataContext,
Path = new PropertyPath("SelectedItems"),
Mode = BindingMode.OneWay
});
Interaction.GetBehaviors(this.BackupsGrid).Add(multiSelectBehavior);
试试这个:
var multiSelectBehavior = new MultiSelectBehavior();
BindingOperations.SetBinding(multiSelectBehavior, MultiSelectBehavior.SelectedItemsProperty, new Binding("SelectedItems"));
Interaction.GetBehaviors(this.BackupsGrid).Add(multiSelectBehavior);
已接受的答案似乎在设计器中不起作用,因为从未引发 OnAttached
事件。一种在运行时和设计器中都有效的方法是对行为使用 Attach()
方法。在这种情况下,它看起来像这样:
var multiSelectBehavior = new MultiSelectBehavior();
BindingOperations.SetBinding(multiSelectBehavior, MultiSelectBehavior.SelectedItemsProperty, new Binding("SelectedItems"));
multiSelectBehavior.Attach(this.BackupsGrid)
我正在尝试找到一种在代码中添加行为的方法,我能够在 XAML 中成功添加它。
这就是我将 XAML 中的行为添加到网格的方式,SelectedItems 是行为中的一个 DP,它是数据绑定到视图模型选定项 属性。我正在监听网格集合更改事件并更新 DP,DP 反过来通知所选项目的视图模式
/// <summary>
/// Dependency Property SelectedItems
/// </summary>
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register("SelectedItems",
typeof(INotifyCollectionChanged), typeof(MultiSelectBehavior),
new PropertyMetadata(null));
AssociatedObject.SelectedItems.CollectionChanged += GridSelectedItems_CollectionChanged;
<i:Interaction.Behaviors>
<behaviors:MultiSelectBehavior SelectedItems="{Binding SelectedItems}"/>
</i:Interaction.Behaviors>
我需要的是在后面的代码中创建这个行为。我在包含网格的 window 的构造函数中执行此操作,但它不起作用,视图模型选择的项目 属性 没有得到更新。
var multiSelectBehavior = new MultiSelectBehaviorSingleton();
BindingOperations.SetBinding(this.BackupsGrid, MultiSelectBehavior.SelectedItemsProperty,
new Binding()
{
Source = this.DataContext,
Path = new PropertyPath("SelectedItems"),
Mode = BindingMode.OneWay
});
Interaction.GetBehaviors(this.BackupsGrid).Add(multiSelectBehavior);
试试这个:
var multiSelectBehavior = new MultiSelectBehavior();
BindingOperations.SetBinding(multiSelectBehavior, MultiSelectBehavior.SelectedItemsProperty, new Binding("SelectedItems"));
Interaction.GetBehaviors(this.BackupsGrid).Add(multiSelectBehavior);
已接受的答案似乎在设计器中不起作用,因为从未引发 OnAttached
事件。一种在运行时和设计器中都有效的方法是对行为使用 Attach()
方法。在这种情况下,它看起来像这样:
var multiSelectBehavior = new MultiSelectBehavior();
BindingOperations.SetBinding(multiSelectBehavior, MultiSelectBehavior.SelectedItemsProperty, new Binding("SelectedItems"));
multiSelectBehavior.Attach(this.BackupsGrid)