如何将TabControl标题中的关闭按钮绑定到窗口的ViewModel中的命令?

时间:2013-03-12 21:25:38

标签: wpf

我正在开发一个工具,想要在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的方法。

1 个答案:

答案 0 :(得分:1)

也许这对你有用,一直都是这样...... 绑定按钮的数据上下文(或您可能需要的任何其他地方)......

DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext}"  

这为你提供了一个窗口'上方'。

如果您有特定Name,则可以ElementName使用RelativeSource

希望这有帮助