0

こんにちは、階層テンプレートに問題があります。カスタム ツリービュー アイテムを作成し、階層テンプレートを使用してバインドしました。しかし、ツリー ビューが更新されません。サイトhttp://social.msdn.microsoft.com/Forums/vstudio/en-US/feac927d-b73c-4361-82f4-cd0a3f055ad0/treeview-binding-and-hierarchicaldatatemplateを参照しました

私のxaml

    <Window.DataContext>
        <vm:ViewModel></vm:ViewModel>
    </Window.DataContext>
    <Grid>
        <TreeView  Name="FT" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Grid.Row="1" Grid.ColumnSpan="4" ItemsSource="{Binding RootNode}"  >
            <TreeView.Resources>
                <DataTemplate DataType="{x:Type vm:FrthChild}">
                    <TextBlock Text="{Binding DisplayName}"/>
                </DataTemplate>

                <HierarchicalDataTemplate DataType="{x:Type vm:ThrdChild}"
         ItemsSource="{Binding FrthChilds}">
                    <TextBlock Text="{Binding DisplayName}"/>
                </HierarchicalDataTemplate>

                <HierarchicalDataTemplate
         DataType="{x:Type vm:SecndChild}"
        ItemsSource="{Binding ThrdChilds}">
                    <TextBlock Text="{Binding DisplayName}"/>
                </HierarchicalDataTemplate>

                <HierarchicalDataTemplate
         DataType="{x:Type vm:FstChild}"
         ItemsSource="{Binding SecndChilds}">
                    <TextBlock Text="{Binding DisplayName}"/>
                </HierarchicalDataTemplate>

                <HierarchicalDataTemplate  DataType="{x:Type vm:ROOT}" ItemsSource="{Binding FstChilds}">
                    <TextBlock Text="{Binding DisplayName}"/>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</Window>

私のビューモデルクラス

    namespace WpfApplication1 : INotifyPropertyChanged
    {
        public class ViewModel
        {
            public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, e);
        }
            public ViewModel()
            {
                RootNode = new ROOT();
            }
            public ROOT RootNode
            {
                get;
                set;
            }
        }
    }

私のツリービューアイテムクラス

namespace WpfApplication1
{
    public class NodeTypes
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, e);
        }
        public string DisplayName
        { get; set; }
    }
    public class ROOT : NodeTypes
    {
        public ROOT()
        {
            FstChilds = new ObservableCollection<FstChild>();
        }
        public ObservableCollection<FstChild> FstChilds { get; set; }
    }
    public class FstChild : NodeTypes
    {
        public FstChild()
        {
            SecndChilds = new ObservableCollection<SecndChild>();
        }
        public ObservableCollection<SecndChild> SecndChilds { get; set; }
    }
    public class SecndChild : NodeTypes
    {
        public SecndChild()
        {
            ThrdChilds = new ObservableCollection<ThrdChild>();
        }
        public ObservableCollection<ThrdChild> ThrdChilds { get; set; }
    }
    public class ThrdChild : NodeTypes
    {
        public ThrdChild()
        {
            FrthChilds = new ObservableCollection<FrthChild>();
        }
        public ObservableCollection<FrthChild> FrthChilds { get; set; }
    }
    public class FrthChild : NodeTypes
    {

    }
}

そして、xaml.cs にいくつかの項目を追加しました...テスト アプリケーションを簡単に作成できるようにしました.後で ICommand を使用してこれを実装します。

Xaml.cs

        namespace WpfApplication1
        {
            /// <summary>
            /// Interaction logic for MainWindow.xaml
            /// </summary>
            public partial class MainWindow : Window
            {
                public MainWindow()
                {
                    InitializeComponent();
                    ((ViewModel)this.DataContext).RootNode = new ROOT();
                    ((ViewModel)this.DataContext).RootNode.DisplayName = "sdsds";
                    ((ViewModel)this.DataContext).OnPropertyChanged(new PropertyChangedEventArgs("RootNode"));
                    ((ViewModel)this.DataContext).RootNode.OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
                    ((ViewModel)this.DataContext).RootNode.FstChilds.Add(new FstChild());
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].DisplayName = "sered";
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds.Add(new SecndChild());
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].DisplayName = "dsdsd";
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].ThrdChilds.Add(new ThrdChild());
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].ThrdChilds[0].DisplayName = "dsds";
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].ThrdChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].ThrdChilds[0].FrthChilds.Add(new FrthChild());
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].ThrdChilds[0].FrthChilds[0].DisplayName = "dsds";
                    ((ViewModel)this.DataContext).RootNode.FstChilds[0].SecndChilds[0].ThrdChilds[0].FrthChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));

                }
            }
        }

誰でもこれで私を助けることができますか??

4

2 に答える 2

1

RootNode は IEnumerable でなければならないので、ViewModel を変更しました:

    public class ViewModel
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, e);
    }
    public ViewModel()
    {
        RootNode = new ObservableCollection<ROOT>() { new ROOT() };
    }
    public ObservableCollection<ROOT> RootNode
    {
        get;
        set;
    }
}

および MainWindow ctor:

        public MainWindow()
    {
        InitializeComponent();
        // ((ViewModel)this.DataContext).RootNode = new ROOT();
        ((ViewModel)this.DataContext).RootNode[0].DisplayName = "sdsds";
        ((ViewModel)this.DataContext).OnPropertyChanged(new PropertyChangedEventArgs("RootNode"));
        ((ViewModel)this.DataContext).RootNode[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
        ((ViewModel)this.DataContext).RootNode[0].FstChilds.Add(new FstChild());
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].DisplayName = "sered";
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds.Add(new SecndChild());
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].DisplayName = "dsdsd";
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].ThrdChilds.Add(new ThrdChild());
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].ThrdChilds[0].DisplayName = "dsds";
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].ThrdChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].ThrdChilds[0].FrthChilds.Add(new FrthChild());
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].ThrdChilds[0].FrthChilds[0].DisplayName = "dsds";
        ((ViewModel)this.DataContext).RootNode[0].FstChilds[0].SecndChilds[0].ThrdChilds[0].FrthChilds[0].OnPropertyChanged(new PropertyChangedEventArgs("DisplayName"));

    }

そしてすべて表示されました。

編集: 最後のコメントに関しては、ItemContainer スタイルを使用してみることができます

        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Setter Property="IsSelected" Value="{Binding YourProperty}"></Setter>
            </Style>
        </TreeView.ItemContainerStyle>
于 2013-09-03T07:07:18.953 に答える