C#wpf数据绑定命令在contextmenu中不起作用

时间:2017-10-10 08:16:38

标签: c# wpf mvvm

我正在学习wpf和mvvm,我决定为自己创建一个Soundboard来练习,到目前为止它还是很顺利。 现在我已经创建了一个数据窗口,对于程序在指定目录中找到的每个文件,它将创建一个带有文件名称的按钮,我可以单击它来播放。到现在为止还挺好。 但是我现在尝试创建一个ContextMenu,以便当我想从列表中删除文件时,我可以右键单击并选择删除,但是这个命令不起作用,即使我对常规按钮具有完全相同的命令结构。 / p>

我对整个RelativeSource事情感到非常困惑,并且已经很高兴我的常规'play'命令在按钮中工作了。

如果有人能指出我正确的方向,这将是伟大的。我真的可以使用我的具体问题的解释,因为这似乎总是帮助我一个通用的例子。我试图阅读所有相关问题,但似乎从那里看不出来。

我的ItemsControl:

<ItemsControl x:Name="MySounds" ItemsSource="{Binding Sounds}">

ItemTemplate:

<ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Button Style="{StaticResource mainButton}"
                                Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.PlaySound}" 
                                CommandParameter="{Binding Path=Tag, RelativeSource={RelativeSource Self}}"
                                Tag="{Binding Path=Name}">
                            <TextBlock Text="{Binding Path=NormalizedName}" TextWrapping="Wrap" Height="auto" />
                            <Button.ContextMenu>
                                <ContextMenu>
                                    <MenuItem Header="{Binding Path=Name}" 
                                              Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.RemoveSound}" 
                                              CommandParameter="{Binding Path=Tag, RelativeSource={RelativeSource Self}}">
                                        <MenuItem.Icon>
                                            <Image Source="\WpfPractice;component\Images\CoffeeArt.png" Width="20" VerticalAlignment="Center"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                </ContextMenu>
                            </Button.ContextMenu>
                        </Button>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>

我的viewmodel中有一个通用的RelayCommand,一切正常,问题实际上只是绑定。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用以下命令替换MenuItem中的命令字符串:

Command="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.RemoveSound}"

答案 1 :(得分:0)

如果将Tag的{​​{1}}属性绑定到Button,则可以使用ItemsControl的{​​{1}}属性绑定到该命令:

PlacementTarget