3

HierarchicalDataTemplateを使用して、チェックボックスを使用してクラスをTreeViewにバインドしています。コードは正常に機能しており、すべてが正常に表示されていますが、ツリービューでアイテムの子のリストを取得できるようにしたいと思います。

チェックボックスをクリックしたときに、親ノードと子ノードを選択できるようにしたい。チェックボックスをラップすることになっているTreeViewItemにアクセスできる場合、これは簡単に実行できますが、チェックボックスのParentプロパティはnullです...HierarchicalDataTemplateにマップされているクラスにしかアクセスできないようです。

<TreeView Margin="12" Name="trv1" SelectedItemChanged="trv1_SelectedItemChanged">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type src:Location}" ItemsSource="{Binding Path=Sublocations}">
                <CheckBox Content="{Binding Name}" Tag="{Binding}" IsChecked="{Binding IsChecked}" Click="checkBox_Click"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type src:Sublocation}" ItemsSource="{Binding Path=Children}">
                <CheckBox Content="{Binding Name}" Tag="{Binding}" IsChecked="{Binding IsChecked}" Click="checkBox_Click"/>
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type src:Child}">
                <CheckBox Content="{Binding Name}" Tag="{Binding}" IsChecked="{Binding IsChecked}" Click="checkBox_Click"/>
            </DataTemplate>

        </TreeView.Resources>
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected" Value="{Binding IsChecked}"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>
4

4 に答える 4

0

MVVM パターンに固執したい場合は、次のことを行う必要があります: 選択が変更されたときにコマンドをトリガーします (私は TreeView.SelectedItemChanged イベントについて話しています)。

次に、このコマンドを使用して、ビュー モデルの 'SelectedItems' プロパティを更新します。

public class MyViewModel
{
    // your view model code...
    // ........................

    // this object better be more strongly typed
    private object _mySelectedItem; 

    public object MySelectedItem
    {
        get { return _mySelectedItem; }
        set { 
              _mySelectedItem = value;

              // the following method will handle the changed item. Problem solved              
              HandleTheNewChangedItem(value);
            }
    }
}
于 2011-01-25T21:36:20.267 に答える
0

FYI: instead of having to get the the TreeViewItem I find it better to include a reference to the parent in your model so in your Nodes class:

Node.Parent {get{return this._parent;}}

Then when building your collection you would have to have set the values but it makes life fantastically easy thereon: imagin getting you the the parent any number of levels up:

myNode.Parent.Parent.Parent

To get your TreeViewItem: (from my answer here: How to get TreeViewItem from HierarchicalDataTemplate item?)

I had to set a the last selected TreeViewItem in the routed TreeViewItem.Selected event which bubbles up to the tree view (the TreeViewItem's themselves do not exist at design time as we are using a HierarchicalDataTemplate).

The event can be captured in XAML as so:

Then the last TreeViewItem selected can be set in the event as so:

private void TreeViewItemSelected(object sender, RoutedEventArgs e)
{
    TreeViewItem tvi = e.OriginalSource as TreeViewItem;

    // set the last tree view item selected variable which may be used elsewhere as there is no other way I have found to obtain the TreeViewItem container (may be null)
    this.lastSelectedTreeViewItem = tvi;

    ...
 }
于 2010-11-15T02:45:17.810 に答える
0

最適ではないかもしれない解決策を思いつきましたが、うまくいきました。TreeView スタイルに EventSetter を追加し、TreeViewItem オブジェクトのクリック イベントを割り当てました。

            <TreeView.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsSelected" Value="{Binding IsChecked}"/>
                    <EventSetter Event="Selected" Handler="tvi_Selected"/>
                </Style>
            </TreeView.ItemContainerStyle>

このようにして、TreeViewItem である送信者オブジェクトにアクセスし、ノード間を移動できます。

編集:この「ソリューション」は、オブジェクトの子である選択されたオブジェクトではなく、最上位の TreeViewItem オブジェクトのみを提供します。

編集 2: treeviewitems では、実際には子 treeviewitems または親 treeviewitems にアクセスできないようです。私は間違っていたと思います。

于 2010-07-05T16:57:09.803 に答える