我正在学习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,一切正常,问题实际上只是绑定。
答案 0 :(得分:0)
您可以尝试使用以下命令替换MenuItem中的命令字符串:
Command="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.RemoveSound}"
答案 1 :(得分:0)
如果将Tag
的{{1}}属性绑定到Button
,则可以使用ItemsControl
的{{1}}属性绑定到该命令:
PlacementTarget