【发布时间】:2013-03-13 05:31:54
【问题描述】:
我正在开发一个工具,并希望在 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 并且上面有这个命令。这......有点奇怪,因为项目集合属于窗口。类似的 StackOverflow 帖子似乎建议自己制作绑定项目 ViewModel,并为它们提供一个引发由窗口处理的事件的命令。我不明白“按钮在单击时引发事件”之上的额外间接层对我有什么作用。我想这是唯一的方法?我想不出办法将 Window 的 DataContext 传送到这个 XAML。
【问题讨论】:
-
你的 windows DataContext 是你的 ViewModel 吗?或者什么元素有你的 ViewModel,因为你可以使用 ElementName 绑定,例如
Command="{Binding Path=CloseSelectedFileCommand, ElementName=myWindowOrControlName}" -
是的,Window的DataContext就是ViewModel。到目前为止,看起来 NSGaga 给出的答案是可行的,我正在使用它。
标签: wpf