如何在后面的代码中添加WPF行为

时间:2017-09-13 19:48:25

标签: wpf wpf-controls

我试图找到一种在代码中添加行为的方法,我可以在XAML中成功添加它。

这就是我将XAML中的行为添加到网格中的方式,SelectedItems是行为中的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>

我需要的是在后面的代码中创建此行为。我在包含网格的窗口的构造函数中执行此操作,但它不起作用,viewmodel selected items属性未更新。

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);

2 个答案:

答案 0 :(得分:1)

试试这个:

var multiSelectBehavior = new MultiSelectBehavior();
BindingOperations.SetBinding(multiSelectBehavior, MultiSelectBehavior.SelectedItemsProperty, new Binding("SelectedItems"));
Interaction.GetBehaviors(this.BackupsGrid).Add(multiSelectBehavior);

答案 1 :(得分:0)

接受的答案在设计器中似乎不起作用,因为从未引发OnAttached事件。一种在运行时以及设计器中均可使用的方法是对行为使用Attach()方法。在这种情况下,将如下所示:

var multiSelectBehavior = new MultiSelectBehavior();
BindingOperations.SetBinding(multiSelectBehavior, MultiSelectBehavior.SelectedItemsProperty, new Binding("SelectedItems"));
multiSelectBehavior.Attach(this.BackupsGrid)