我正在开发一个工具,并希望在 TabControl 中的选项卡中添加一个关闭按钮。我不知道如何使按钮的 Command 属性绑定到我窗口的 ViewModel 上的适当属性。
虚拟机很简单。只是 INPC 实现和一个名为 CloseSelectedFileCommand 的 ICommand 属性。
TabControl 的 XAML 省略了其他部分,没有什么漂亮的,因为漂亮是在“它有效”之后:
<TabControl ItemsSource="{Binding Results}"
SelectedItem="{Binding SelectedFile}">
<TabControl.ItemTemplate>
<!-- Type is ResultInfo -->
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding FileName}" />
<Button Grid.Column="1" Command="{Binding Path=CloseSelectedFileCommand}">X</Button>
</Grid>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
...
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我明白发生了什么。从按钮的角度来看,当前项目是我收藏的项目之一。他们没有 DataContext,如果他们这样做了,肯定不会是我的 Window 的 ViewModel。我不知道如何使这项工作。我想也许寻找 Window 祖先的 RelativeSource 会有所帮助,但它没有。
我看过一些谷歌搜索。他们似乎建议我的数据项本身应该是一个 ViewModel 并且上面有这个命令。这......有点奇怪,因为项目集合属于窗口。类似的 StackOverflow 帖子似乎建议自己制作绑定项目 ViewModel 并给它们一个命令,该命令引发一个由窗口处理的事件。我不明白“按钮在单击时引发事件”之上的额外间接层对我有什么作用。我想这是唯一的方法?我想不出一种将 Window 的 DataContext 传送到这个 XAML 的方法。