8

私は典型的なツリービューとビューモデルを持っています。ビューモデルには、ツリーのデータソースとして機能する他のビューモデルの監視可能なコレクションがあります。

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>

ただし、HierarchicalDataTemplateの「内部」にある限り、何を試してもコマンドは呼び出されません。

TreeView.InputBindingsのKeyBinding(およびICommand / RelayCommandをItemVMからTreeViewVMに移動)がすべてうまくいくと、コマンドが呼び出されます。

しかし、私はItemVMでコマンドを実行したいと思います(それが理にかなっている場所です)。何か案は?

4

2 に答える 2

8

しかし、私はItemVMでコマンドを実行したいと思います(それが理にかなっている場所です)。何か案は?

TreeViewVMプロパティを介して選択したアイテムを追跡する場合は、でSelectedItem定義でき、コマンドを:に実装できます。InputBindingsTreeViewItemVM

<TreeView ItemsSource="{Binding Items}">
  <TreeView.InputBindings>
    <KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/>
  </TreeView.InputBindings>
</TreeView>

バインディングのソースとしてSelectedItem.Renameを使用するためにサブプロパティ構文がどのように使用されているかに注意してください。ItemVM

残念ながら、で選択したアイテムにバインドするのは少し面倒TreeViewです。SelectedItem(XAMLが示唆しているように)直接バインドすることはできませんが、この制限を克服するためのさまざまな方法があります。

簡単な方法の1つは、BlendInteractivityを使用することです。

<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>

プロパティを設定するSetSeletectedItemCommandonを実装する必要があります。TreeViewVMSelectedItem

于 2013-01-23T13:16:34.683 に答える
6

キーバインディングはTreeViewItemで定義する必要があります。これは、フォーカスを持つ要素であるためです。問題は、スタイルを使用してキーバインディングを定義できないことです。これは、おそらくここで実行したいことです。

これは、カスタムの添付プロパティを使用して、スタイルを介してInputBindingコレクションにアイテムを追加する1つの回避策です。したがって、そのようなものを使用して、TreeView.ItemContainerStyleに割り当てるスタイルを定義する必要があります。

于 2011-03-08T23:28:00.767 に答える