0

私は WPF MultiSelectTreeView を持っています (ここからダウンロード: http://unclassified.software/en/source/multiselecttreeview )。

ここで、ユーザーが選択するアイテムを制御したいと思います。簡単な例は、異なる親の子ノードを選択できないようにすることです。ただし、ViewModel 固有のユース ケースは他にもあります。

PreviewSelectionChanged イベントを使用して条件を直接確認し、それに応じてキャンセル フラグを設定することにより、ウィンドウのコード ビハインドでこれを簡単に実現できます。しかし、View と ViewModel を分離したいので、WindowViewModel でこれを行う方法を探しています。

もちろん、チェックを ViewModel に抽出してビューから呼び出すこともできますが、それは間違っているように見えます。

WindowViewModel _viewModel;

void PreviewSelectionChanged(object sender, PreviewSelectionChangedEventArgs e)
{
     e.Cancel = !this._viewModel.CanSelect(e.Item as TreeItemViewModel);
}

誰にでもアイデアがあることを願っています。

-ティムノット90

4

1 に答える 1

0

TreeView通常、 WPF で階層コレクションを にデータ バインドする場合、カスタム データ項目にはIsSelected、そのクラスで定義されたプロパティが必要です。そうであれば、IsSelectedeach のプロパティにデータ バインドできTreeViewItemます。

<TreeView ItemsSource="{Binding YourCollection}" ... >
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

これが完了したら、そのプロパティを に設定しtrueて項目を選択し、項目falseを選択解除することができます。

// Select Item
dataObject.IsSelected = true;

// Deselect Item
dataObject.IsSelected = false;

PropertyChanged各アイテムのイベントにハンドラーを追加して、IsSelectedプロパティがいつ変更されたかを検出できます (INotifyPropertyChangedインターフェイスが期待どおりに実装されている場合)。

于 2015-02-23T10:21:55.473 に答える