C# 使用混合集合的WPF Treeview数据绑定

C# 使用混合集合的WPF Treeview数据绑定,c#,wpf,treeview,C#,Wpf,Treeview,我试图通过使用复合集合正确绑定多个集合。 请指出我的错误 我期待着像这样的事情 汽车 年 2014年 2013年 名字 丰田 欧元 奔驰 但是相反,我得到了 汽车 2014年 2013年 丰田 奔驰 XAML: 车辆等级: public class Car: ViewModelBase { private string _carname= String.Empty; public string CarName { get

我试图通过使用复合集合正确绑定多个集合。 请指出我的错误

我期待着像这样的事情

  • 汽车
      • 2014年
      • 2013年
    • 名字
      • 丰田
      • 欧元
        • 奔驰
但是相反,我得到了

  • 汽车
    • 2014年
    • 2013年
    • 丰田
    • 奔驰
XAML:

车辆等级:

public class Car: ViewModelBase
{


    private string _carname= String.Empty;


    public string CarName
    {
        get { return _carname; }
        set
        {
            //ignore if values are equal
            if (value == _carname) return;

            _carname= value;
            OnPropertyChanged("CarName");
        }
    }



    private ObservableCollection<Year> _years=new ObservableCollection<Year>();

    public ObservableCollection<Year> Years
    {
        get { return _years; }
        set
        {
            //ignore if values are equal
            if (value == _years) return;

            _years= value;
            OnPropertyChanged("Years");
        }
    }
    public IList Children
    {
        get
        {
            return new CompositeCollection()
        {
            new CollectionContainer() { Collection = this.Years},
            new CollectionContainer() { Collection = ...},
            new CollectionContainer() { Collection =... }
        };
        }
    }
公共级汽车:ViewModelBase
{
私有字符串_carname=string.Empty;
公共字符串
{
获取{return\u carname;}
设置
{
//如果值相等,则忽略
如果(值==\u carname)返回;
_卡纳姆=价值;
不动产变更(“卡纳姆”);
}
}
私人可观测集合_年=新可观测集合();
公众可观察的收集年份
{
获取{返回_年;}
设置
{
//如果值相等,则忽略
如果(值==_年)返回;
_年=价值;
不动产变更(“年”);
}
}
公营儿童
{
得到
{
返回新的CompositeCollection()
{
new CollectionContainer(){Collection=this.Years},
新建CollectionContainer(){Collection=…},
新建CollectionContainer(){Collection=…}
};
}
}

}

也许您最好不要使用分层数据模板,因为您的数据结构似乎不是递归的

但如果你想保留它们,你可以采取以下措施:

public class YearsCollection : ObservableCollection<Year>
{
}
...
YearsCollection _years = new YearsCollection();

public YearsCollection Years
{
    get { return _years; }
    set
    {
        //ignore if values are equal
        if (value == _years) return;

        _years = value;
        OnPropertyChanged("Years");
    }
}

public IList Children
{
    get
    {
        return new[]
        {
            this.Years
            ...
        };
    }
}
public class years集合:ObservableCollection
{
}
...
YearsCollection _years=新的YearsCollection();
公共年收集年
{
获取{返回_年;}
设置
{
//如果值相等,则忽略
如果(值==_年)返回;
_年=价值;
不动产变更(“年”);
}
}
公营儿童
{
得到
{
返回新的[]
{
这个,好几年了
...
};
}
}
并为每个中间集合添加一个模板:

<HierarchicalDataTemplate DataType="{x:Type local:YearsCollection}" ItemsSource="{Binding}">
    <StackPanel>
        <TextBlock Text="Years" />
    </StackPanel>
</HierarchicalDataTemplate>


谢谢你的回答。我编辑了一下我的帖子,它会在名称或子类别下包含汽车模型。因此,您可以将相同的原则应用于
LocationCollection
,它将具有
Name
属性,如“Euro”,并将包含此位置的名称。
public class YearsCollection : ObservableCollection<Year>
{
}
...
YearsCollection _years = new YearsCollection();

public YearsCollection Years
{
    get { return _years; }
    set
    {
        //ignore if values are equal
        if (value == _years) return;

        _years = value;
        OnPropertyChanged("Years");
    }
}

public IList Children
{
    get
    {
        return new[]
        {
            this.Years
            ...
        };
    }
}
<HierarchicalDataTemplate DataType="{x:Type local:YearsCollection}" ItemsSource="{Binding}">
    <StackPanel>
        <TextBlock Text="Years" />
    </StackPanel>
</HierarchicalDataTemplate>