在Command(初学者)中将Item绑定到UI

时间:2012-12-22 16:48:04

标签: c# wpf mvvm

我有一个Obseravable Collection个项目。该集合显示在树视图中。我想使用上下文菜单从集合中删除一个Item。我不知道怎么办。

例如,假设我有4个treeviewitems(这意味着我在Obseravable Collection中有4个项目)现在,用户想要删除第二个项目,他右键单击第二个treeviewitem,上下文菜单是打开并按下“删除..”如何识别要从集合中删除的项目? (我正在使用Command

上下文菜单如下所示:

     <ContextMenu x:Key="RemoveItemMenu">
        <MenuItem Header="Remove..." Command="RemoveItem"/>
     </ContextMenu> 

将要执行的命令功能:

        private void RemoveItemExcecute()
    {
        //Removing the clicked Item out of the collection
    }

2 个答案:

答案 0 :(得分:1)

您可以向CommandParameter添加MenuItem。这样,您就可以将要删除的项目传递给命令。

<ContextMenu x:Key="RemoveItemMenu">
    <MenuItem Header="Remove..." Command="RemoveItem" CommandParameter="{Binding}" />
</ContextMenu>

您可能希望修改绑定以传递所需的信息。然后,当您处理命令时,您将可以使用该信息:

private void RemoveItemExcecute(object param)
{
    // "param" is the command parameter passed to the command.
    MyItem item = (MyItem)param;
    MyItemCollection.Remove(item);
}

答案 1 :(得分:0)

我会参考this answer,其中介绍了如何使用行为向SelectedItem添加TreeView字段。

从那里你可以在ViewModel的RemoveItemExecute方法中引用SelectedTreeItem。

<强> XAML:

<TreeView ItemsSource="{Binding MyCollection}">
    <e:Interaction.Behaviors>
        <behaviours:BindableSelectedItemBehavior SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" />
    </e:Interaction.Behaviors>
</TreeView>

<强> C#:

public ObservableCollection<MyObject> MyCollection { get; set; }

public MyObject MySelectedItem { get; set; } // You'll want to use INotifyPropertyChanged magic here

private void RemoveItemExcecute()
{
    MyCollection.Remove(MySelectedItem);
}

另一种选择是使用CommandParameterMySelectedItem传递给该函数。

<强> XAML:

<ContextMenu x:Key="RemoveItemMenu">
    <MenuItem Header="Remove..." Command="RemoveItem" CommandParameter="{Binding MySelectedItem}"/>
 </ContextMenu> 

<强> C#:

private void RemoveItemExcecute(object param)
{
    var selectedItem = (MyObject)param;
    MyCollection.Remove(selectedItem);
}