2

コントロールを使用してアプリにナビゲーションを実装するために、プレゼンテーション モデルを使用していTreeViewます。のTreeViewItemIsSelected プロパティを、双方向バインディングを介してビュー モデルにバインドしています。子を持つノードが選択されている場合、クリックされたノードではなく、そのノードの最初の子が選択されるようにします。TreeViewItemプレゼンテーション モデルで IsSelected プロパティを設定しているときに、プロパティ変更イベントをリッスンしないようです。最初の子ノードが選択されていますが、親ノードは選択解除されていません。これが私のプレゼンテーションモデルのコードです。

public bool IsSelected {
    get {
        return this._isSelected;
    }
    set {
        if(this._isSelected != value) {
            this._isSelected = value;
            if(this.Nodes.Count > 0) {
                this._isSelected = false;
                this.Nodes[0].IsSelected = true;
            }
            this.NotifyPropertyChanged("IsSelected");
        }
    }
}

そして、ここに私のスタイルがありますTreeViewItem:

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
4

3 に答える 3

2

私は非常によく似た問題を抱えていて、コードで子を選択するときに、親ノードが「UnSelect」と呼ばれるように、TreeViewItem ラッパーにもフォーカスを与える必要があることがわかりました。そのため、xaml にイベント ハンドラを追加しました。

<EventSetter Event="TreeViewItem.Selected" 
                    Handler="TreeViewItem_Selected" 
                        />

そして部分クラスでは:

Private Sub TreeViewItem_Selected(ByVal sender As System.Object, ByVal e As RoutedEventArgs)
            If CType(sender, TreeViewItem) IsNot Nothing Then
                CType(sender, TreeViewItem).Focus()
                e.Handled = True
            End If
End Sub
于 2009-11-18T16:10:36.077 に答える
1

考慮すべき別の可能性:

TreeView は、ツリー内の 2 つの TreeViewItem を同時に選択できないようにするため、これを防ぐ必要があります。おそらく TreeView のバグですが、TreeView の使用方法に問題がある可能性もあります。

効率のために、TreeView はその下にある TreeViewItems を見つける方法について非常にうるさいです。アルゴリズムは事実上次のようになります (段階的に行われます)。

  1. TreeView オブジェクトの項目コンテナーを調べます
  2. これらの TreeView オブジェクトのアイテム コンテナーの中から、さらに TreeView オブジェクトを探します。
  3. TreeView オブジェクトが見つからなくなるまで、手順 3 を繰り返します。

このため、TreeViewItems の各レベルが前のレベルの直下にある場合にのみ、TreeView はその子孫を見つけることができます。

たとえば、これはうまくいきます:

<TreeView>
  <TreeViewItem>
    <TreeViewItem />
  </TreeViewItem>
  ...
</TreeView>

これは次のようになります。

<HierarchicalDataTemplate TargetType="{x:Type MyItemType"} ItemsSource="{Binding subItems}">
  ...
</HierarchicalDataTemplate>

<TreeView ItemsSource="{Binding items}" />

ただし、次のように非 TreeViewItems が挿入されている場合は機能しません。

<TreeView>
  <TreeViewItem>
    <Border>
      <TreeViewItem/>
    </Border>
  </TreeViewItem>
</TreeView>

またはこれ:

<TreeView>
  <DockPanel>
    <TreeViewItem>
      <TreeViewItem/>
    </TreeViewItem>
  </DockPanel>
</TreeView>

これらの最後の 2 つのケースは問題なく表示されますが、TreeView は TreeViewItems を認識しないため、その選択コードは無効になります。これにより、説明した症状が発生します。

これがあなたの場合かどうかはわかりませんが、念のために言及しておく必要があると思いました。

于 2009-11-19T06:00:56.033 に答える