ツールに取り組んでいて、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>
何が起こっているのかわかります。ボタンの観点から、現在のアイテムは私のコレクションのアイテムの1つです。それらにはDataContextがなく、もしそうなら、それは確かに私のWindowのViewModelではないでしょう。これを機能させる方法がわかりません。Windowの祖先を探しているRelativeSourceが役立つと思いましたが、そうではありませんでした。
私はいくつかのGoogle検索を見てきました。彼らは、私のデータ項目自体がViewModelであり、このコマンドが含まれている必要があることを示唆しているようです。アイテムのコレクションはウィンドウに属しているので、それはちょっと奇妙です。同様のStackOverflowの投稿は、バインドされたアイテムをViewModels自体にし、ウィンドウによって処理されるイベントを発生させるコマンドをそれらに与えることを示唆しているようです。「ボタンをクリックするとイベントが発生する」の上にある間接参照の追加レイヤーが私にどのような影響を与えるのかわかりません。私はそれが唯一の方法だと思いますか?ウィンドウのDataContextをこのXAMLにシャトルする方法を考えることはできません。