TreeViewItemのキーバインディング
-
01-10-2019 - |
質問
典型的なツリービューとビューモデルがあります。 ViewModelには、ツリーのデータソースとして機能する他のViewModelの観察可能なコレクションがあります。
public class TreeViewVM {
public ObservableCollection<ItemVM> Items { get; private set; }
public ItemVM SelectedItem { get; set; }
}
とitemvm:
public class ItemVM {
public string Name { get; set; }
public ImageSource Image { get; private set; }
public ObservableCollection<ItemVM> Children { get; private set; }
public ICommand Rename { get; private set; }
}
景色 :
<TreeView Selecteditem="{Binding SelectedItem}" ItemsSource="{Binding Items}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel.InputBindings>
<KeyBinding Key="F2" Command="{Binding Rename}"/>
</StackPanel.InputBindings>
<Image Source="{Binding Image}"/>
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
しかし、私のコマンドは、階層datatemplateの「内部」である限り、何を試しても呼び出されません。
treeview.inputbindings(およびicommand / liraycommandからitemvmからtreeviewvmへのキーバインディングを移動すると、すべてが素晴らしい場合、コマンドが呼び出されます。
しかし、私はitemVMにコマンドを持ちたいと思っています(それが理にかなっている場所であるため)。何か案は?
解決
キーバインディングは、焦点のある要素であるため、TreeViewItemで定義する必要があります。問題は、スタイルを使用してキーバインディングを定義できないことです。これは、おそらくここでやりたいことです。
ここ カスタム接続プロパティを使用して、スタイルを介して入力バインディングコレクションにアイテムを追加する1つの回避策です。そのため、そのようなものを使用して、TreeView.ItemContainerStyleに割り当てるスタイルを定義したいと思います。
他のヒント
しかし、私はitemVMにコマンドを持ちたいと思っています(それが理にかなっている場所であるため)。何か案は?
もしも TreeViewVM
選択したアイテムを介して追跡します SelectedItem
定義できるプロパティ InputBindings
の上 TreeView
また、コマンドが実装されています ItemVM
:
<TreeView ItemsSource="{Binding Items}">
<TreeView.InputBindings>
<KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/>
</TreeView.InputBindings>
</TreeView>
サブプロパティの構文がどのようにあるかに注意してください SelectedItem.Rename
使用するために使用されます ItemVM
結合の原因として。
残念ながら、選択したアイテムにバインドするのは少し退屈です TreeView
. 。直接バインドできません SelectedItem
(あなたのXAMLが示唆しているように見えます)が、存在します この制限を克服するためのさまざまな方法.
1つの簡単な方法は使用することです インタラクティブ性をブレンドします:
<TreeView Name="treeView" ItemsSource="{Binding Items}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding SetSelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=treeView}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeView>
あなたはaを実装する必要があります SetSeletectedItemCommand
の上 TreeViewVM
それはプロパティを設定します SelectedItem
.