WPF CollectionViewSource的Group属性

时间:2011-07-29 07:34:41

标签: c# .net wpf treeview

目前我正在开发一个应用程序,其中日期按年和月(内部组)分组。

我搜索了一些关于TreeView分组的示例并找到了这样的解决方案:我使用Source的简单日期列表CollectionViewSource,定义组和排序,为我的{编写模板{1}}等等。

工作示例(但仅适用于一个组嵌套)包含以下代码:

TreeView

由于我使用MVVM模式,因此我将<TreeView ItemsSource={Binding Source={StaticResource CVS}, Path=Groups} />定义为视图模型的属性(而不是资源)。

可能是我站在错误的脚上,但我无法移植上面的代码,我尝试这样做:

CollectionViewSource,等等:

<TreeView ItemsSource={Binding Path=CVS.Groups} />但它不起作用。 <TreeView ItemsSource={Binding Path=CVS.View} />没有属性CollectionViewSource

我做错了什么?

更新

完整源代码:

在DayWorkInfoViewModel.cs中:

Group

在DayWorkViewModel.cs中:

internal sealed class DayWorkInfoViewModel : ViewModelBase
{
    #region properties

    private DateTime _date;

    public DateTime Date
    {
        get
        {
            return _date;
        }
        set
        {
            if (_date != value)
            {
                _date = value;
                OnPropertyChanged("Date");
                OnPropertyChanged("Year");
                OnPropertyChanged("Month");
                OnPropertyChanged("MonthName");
                OnPropertyChanged("Day");
            }
        }
    }

    public int Year
    {
        get
        {
            return Date.Year;
        }
    }

    public int Month
    {
        get
        {
            return Date.Month;
        }
    }

    public string MonthName
    {
        get
        {
            return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(Date.Month);
        }
    }

    public int Day
    {
        get
        {
            return Date.Day;
        }
    }

    #endregion properties
}

在WorkView.xaml中:

internal sealed class WorkViewModel : PageBaseViewModel
{
    #region fields

    private readonly IWorkService _workService;

    #endregion fields

    #region properties

    private readonly ObservableCollection<DayWorkInfoViewModel> _dayWorkInfos = new ObservableCollection<DayWorkInfoViewModel>();

    public CollectionViewSource DayWorkInfos { get; set; }

    private DayWorkInfoViewModel _selectedDayWorkInfo;

    public DayWorkInfoViewModel SelectedDayWorkInfo
    {
        get
        {
            return _selectedDayWorkInfo;
        }
        set
        {
            if (_selectedDayWorkInfo != value)
            {
                _selectedDayWorkInfo = value;
                OnPropertyChanged("SelectedDayWorkInfo");
            }
        }
    }

    #endregion properties

    #region command properties

    #endregion command properties

    #region ctors

    public WorkViewModel()
    {
        if (IsInDesign)
        {
            _workService = new SimpleWorkService();
        }
        else
        {
            _workService = new WorkService();
        }

        DayWorkInfos = new CollectionViewSource { Source = _dayWorkInfos };
        DayWorkInfos.GroupDescriptions.Add(new PropertyGroupDescription("Year"));
        DayWorkInfos.GroupDescriptions.Add(new PropertyGroupDescription("MonthName"));
        DayWorkInfos.SortDescriptions.Add(new SortDescription("Year", ListSortDirection.Ascending));
        DayWorkInfos.SortDescriptions.Add(new SortDescription("Month", ListSortDirection.Ascending));

        DoAsync<IEnumerable<DateTime>>(
            () =>
            {
                return _workService.GetDayWorkInfos();
            },
            (result) =>
            {
                _dayWorkInfos.Clear();

                foreach (var dt in result)
                {
                    _dayWorkInfos.Add(new DayWorkInfoViewModel { Date = dt });
                }

                //DayWorkInfos.View.Refresh();
            },
            (exc) =>
            {
                ShowError("Couldn't load work dates...");
            },
            "Loading work dates...");
    }

    #endregion ctors
}

在WorkView.xaml.cs中:

<controls:PageBase.Resources>
    <DataTemplate x:Key="DayTemplate">
        <TextBlock Text="{Binding Path=Day}" />
    </DataTemplate>
    <HierarchicalDataTemplate x:Key="MonthTemplate"
                              ItemsSource="{Binding Path=Items}"
                              ItemTemplate="{StaticResource DayTemplate}">
        <TextBlock Text="{Binding Path=Date}" />
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate x:Key="YearTemplate"
                              ItemsSource="{Binding Path=Items}"
                              ItemTemplate="{StaticResource MonthTemplate}">
        <TextBlock Text="{Binding Path=Year}" />
    </HierarchicalDataTemplate>
</controls:PageBase.Resources>
<Grid>
    <telerik:RadTreeView Margin="10"
                         BorderBrush="Red"
                         BorderThickness="3"
                         ItemsSource="{Binding DayWorkInfo.Groups}"
                         ItemTemplate="{StaticResource YearTemplate}" />
</Grid>

1 个答案:

答案 0 :(得分:5)

我猜你是想做这样的事。

public partial class MainWindow : Window
{
    private CollectionViewSource cvs =  new CollectionViewSource();

    public CollectionViewSource CVS
    {
        get
        {
            return this.cvs;
        }
    }
    public MainWindow()
    {
        InitializeComponent();
        ObservableCollection<DateTime> list = new ObservableCollection<DateTime>();
        list.Add(new DateTime(2010, 2, 11));
        list.Add(new DateTime(2010, 7, 11));
        list.Add(new DateTime(2010, 7, 14));
        list.Add(new DateTime(2010, 2, 5));
        list.Add(new DateTime(2010, 3, 6));
        list.Add(new DateTime(2011, 1, 8));
        list.Add(new DateTime(2011, 7, 3));
        list.Add(new DateTime(2011, 1, 12));
        list.Add(new DateTime(2011, 2, 3));

        this.cvs.Source = list;
        this.cvs.GroupDescriptions.Add(new PropertyGroupDescription("Year"));
        this.cvs.GroupDescriptions.Add(new PropertyGroupDescription("Month"));
        this.DataContext = this;
    }
}

和XAML:

    <Window x:Class="CollectionViewSource.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView ItemsSource="{Binding Path=CVS.View.Groups}">           
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type CollectionViewGroup}" ItemsSource="{Binding Items}">
                    <TextBlock Text="{Binding Name}"/>
                </HierarchicalDataTemplate>
                <DataTemplate DataType="{x:Type System:DateTime}">
                    <TextBlock Text="{Binding Date}"/>
                </DataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</Window>