我正在开发一个工具,想要向 TabControl 中的选项卡添加一个关闭按钮。我不知道如何将按钮的 Command 属性绑定到窗口 ViewModel 上的相应属性。
VM 很简单。只需 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 本身,并给它们一个命令来引发由窗口处理的事件。我不明白“单击按钮时引发事件”之上的额外间接层对我有什么作用。我想这是唯一的方法吧?我想不出一种方法将窗口的 DataContext 传递到此 XAML。
也许这对你有用,沿着这些思路......
绑定按钮数据上下文(或您可能需要的任何其他地方)...
DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext}"
这提供了您在其“上方”某处有一个窗口。
或者如果你有具体的Name
您可以使用ElementName
类似于RelativeSource
.
希望这可以帮助
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)