1

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

4

1 回答 1

1

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

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

这为您提供了一个“上方”某处的窗口。

或者,如果您有特定的Name,您可以使用ElementName类似于RelativeSource.

希望这可以帮助

于 2013-03-12T21:31:54.883 回答