1

私が抱えている問題を単純化するために、この架空のシナリオを考えてみましょう。

コントロールの XAML で、1TreeViewつと 2 つの固定ルートTreeViewItemノード 'AItemsNode' と 'BItemsNode' を定義しました。その ViewModel で、AItems と BItems という 2 つの子コレクションを公開します。次に、各ルート ノードの ItemsSource プロパティを ViewModel のそれぞれのコレクションにバインドします。これはうまく機能し、私が望むものを正確に表示します。

次に、ApplicationCommands.Open の CommandBinding を2 つのルート ノードの子TreeViewItem ノードに追加します。具体的には、ルート 'AItemsNode' の下の子の 'Open' CommandBinding が 'OpenAItem_Executed' を指し、2 番目のルート ノードの子が 'OpenBItem_Executed' を指すようにします。

私が抱えている問題は、TreeViewItem オブジェクト自体に CommandBindings を設定する方法がわからないことです。XAML を介してこれをまったく理解することはできません。コード ビハインドでそれを行う場合は、ItemContainerGenerator と統合し、生成されているものを調べてバインディングを追加する必要があり、基本的に非常に多くのコードを記述します。 「Open」CommandBinding を TreeView 自体に追加し、SelectedObject を検査してそこから移動することもできます。データ型に基づいてあらゆる場所で委任する単一の Open_Executed ハンドラーがあるため、最適ではありませんが、機能します!

それでも、生成された TreeViewItem に CommandBinding を直接追加してそれを回避し、コードをよりきれいに分離する方法を誰かが教えてくれることを願っています。

では、TreeViewItem のスタイル (または XAML の他の方法) を介して特定の CommandBindings を適用するにはどうすればよいでしょうか?

4

2 に答える 2

0

私はあなたが実装していないと思います(代わりに/MVVMを使用することで、この問題を直感的に解決したでしょう)RelayCommandsDelegateCommandsRoutedCommands

ただし、あなたの場合、via targetted toのInitializedイベントを処理する必要があります。で使用します。そして、イベント ハンドラーに着信する値 (初期化される自体)に を追加するコードを配置します。TreeViewItemStyleTreeViewItemEventSetterStyleCommandBindinge.OriginalSourceTreeViewItemTreeViewItem.Initialized

これが理にかなっているかどうか教えてください。

編集

x 個の個別の の x 個のキーボード ショートカットがあることを理解していますTreeViewItems。もしそうなら x スタイルの数は私にとって理にかなっています。

しかし、ツリービューレベルで単一のハンドラーでこれを雑然としたい場合は、そのレベルで添付イベントを処理する必要があるかもしれません... indv treeviewitem から親までイベントがバブルするInitialisedとは思わないLoadedツリービューですが、それをチェックするのは面白いでしょうし、間違っていることが証明されてうれしいです!

さらに、これは折りたたまれたツリー ビュー アイテムでは機能しない可能性があります。

したがって、折りたたまれたツリー ブランチ内にある特定のツリー ビュー アイテムに対して "Ctrl + o" ショートカットを定義した場合、またはスクロール ビューの外にあるが開いているブランチ内にある場合、ルーティング イベント ベースのメカニズム (およびコマンド バインディング) は機能しません。ルーティングが機能するためにアイテムを(UIメモリで)非仮想化する必要があるため、機能します...

そのため、その場合、私の解決策(私が理解しているように)は少し非現実的になります。

解決

常に見えるものは何ですか?

ツリー表示!

したがって、それを有利に使用してください。すべてのコマンド バインディング (およびショートカット) を TreeView 自体に追加します。

そして、ハンドラー内(すべてのコマンド バインディングに共通する可能性があります) を使用して個々のアイテムを識別するメカニズムItemsSourceを考案します。一般的なスタイル。TreeViewItemViewModelsTreeViewItemViewModelOpenbranch hierarchyIsOpenIsExpandedTreeViewItem

于 2013-06-06T10:14:13.937 に答える
0

mvvm を実装しました。インタラクション トリガーを使用することをお勧めします。

これが正しい方向に役立つことを願っています。

Xaml:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

<TreeView >
    <TreeView.Resources>
        <DataTemplate x:Key="ItemATemplate">
            <TextBlock Text="{Binding MyNodeTitle}">
                                <i:Interaction.Triggers>
                                <i:EventTrigger EventName="PreviewMouseDown">
                                    <i:InvokeCommandAction Command="{Binding AChildCommand}" CommandParameter="{Binding}"/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
            </TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="ItemBTemplate">
            <TextBlock Text="{Binding MyNodeTitle}">
                                <i:Interaction.Triggers>
                                <i:EventTrigger EventName="PreviewMouseDown">
                                    <i:InvokeCommandAction Command="{Binding BChildCommand}" CommandParameter="{Binding}"/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
            </TextBlock>
        </DataTemplate>
    </TreeView.Resources>
    <TreeView.Items>
        <TreeViewItem Header="AItemRootNode" ItemsSource="{Binding SomeAStuff}" ItemTemplate="{StaticResource ItemATemplate}"/>
        <TreeViewItem Header="BItemRootNode" ItemsSource="{Binding SomeBStuff}" ItemTemplate="{StaticResource ItemBTemplate}"/>
    </TreeView.Items>
</TreeView>

ビューモデル:

private ICommand _aChildCommand;
public ICommand AChildCommand
{
    get
    {
        if (_aChildCommand == null)
            _aChildCommand = new DelegateCommand(OnAChild);
        return _aChildCommand;
    }
}

private void OnAChild(object obj)
{
}
于 2013-06-06T11:11:37.190 に答える