我正在开发一个工具,想要在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会有所帮助,但事实并非如此。
我查看了一些Google搜索。他们似乎建议我的数据项本身应该是一个ViewModel,并在其上有这个命令。那是......有点奇怪,因为项目集合属于Window。类似的StackOverflow帖子似乎建议自己创建绑定项ViewModels,并为它们提供一个命令来引发由窗口处理的事件。我不明白在“按钮引发点击事件”之上的额外层次间接为我做了什么。我想这是唯一的方法吗?我想不出把窗口的DataContext传递给这个XAML的方法。
答案 0 :(得分:1)
也许这对你有用,一直都是这样...... 绑定按钮的数据上下文(或您可能需要的任何其他地方)......
DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext}"
这为你提供了一个窗口'上方'。
如果您有特定Name
,则可以ElementName
使用RelativeSource
。
希望这有帮助