3

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

例如,假设我有 4 个树视图项(这意味着我有 4 个项目Obseravable Collection)现在,用户想要删除第二个项目,他右键单击第二个树视图项,打开一个上下文菜单并按下“删除。 ." 如何确定要从集合中删除的项目?(我正在使用Command

上下文菜单如下所示:

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

以及将要执行的命令函数:

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

2 回答 2

1

您可以CommandParameterMenuItem. 这样,您就可以将要删除的项目传递给命令。

<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);
}
于 2012-12-22T18:15:20.667 回答
0

我会参考这个答案,它解释了如何使用 Behaviors 将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);
}

另一种选择是使用 aCommandParameter传递MySelectedItem给函数。

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);
}
于 2012-12-22T18:21:01.037 回答