WPF Treeview数据绑定与混合集合

时间:2014-08-21 18:56:54

标签: c# wpf treeview

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

我期待像

这样的东西
  • 汽车
    • 年份
      • 2014
      • 2013
    • 名称
      • 丰田
      • 欧元
        • 奔驰

但相反,我得到了

  • 汽车
    • 2014
    • 2013
    • 丰田
    • 奔驰

XAML:

<TreeView Margin="8" Grid.Row="2" Grid.RowSpan="2" Name="CarTree" >
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Car}" ItemsSource="{Binding Children}">
            <StackPanel>
                <TextBlock Text="{Binding Path=CarName}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Year}">
            <StackPanel>
                <TextBlock Text="{Binding Path=YearName}" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

年级:

public class Year:ViewModelBase
{
    private string _yearname= String.Empty;
        public string YearName
        {
          get { return _yearname; }
          set
          {
            _yearname= value;
            OnPropertyChanged("YearName");
          }
        }
}

汽车类:

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 =... }
        };
        }
    }

}

1 个答案:

答案 0 :(得分:0)

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

但如果你想保留它们,你可以做类似的事情:

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>