Свойство группы WPF CollectionViewSource - PullRequest
3 голосов
/ 29 июля 2011

В настоящее время я разрабатываю приложение, в котором даты сгруппированы по годам и месяцам (внутренние группы).

Я погуглил несколько примеров группирования в TreeView и нашел такое решение: я использую простой список дат как Source для CollectionViewSource, определяю группы и сортировки, пишу шаблон для моего TreeView и так далее.

Рабочие примеры (но только для вложенности одной группы) включают такой код:

<TreeView ItemsSource={Binding Source={StaticResource CVS}, Path=Groups} />.

Поскольку я использую шаблон MVVM, я определяю CollectionViewSource как свойство модели представления (не как ресурс).

Может быть, я встал не с той ноги, но я не смог перенести код выше, я пытался сделать это:

<TreeView ItemsSource={Binding Path=CVS.Groups} /> и так:

<TreeView ItemsSource={Binding Path=CVS.View} /> но это не работает. CollectionViewSource не имеет свойства Group.

Что я делаю не так?

UPDATE:

Полный исходный код:

В DayWorkInfoViewModel.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
}

В DayWorkViewModel.cs:

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:

<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>

В WorkView.xaml.cs:

public partial class WorkView : PageBase
{
    #region ctors
    public WorkView()
    {
        InitializeComponent();
        DataContext = new WorkViewModel();
    }
    #endregion ctors
}

1 Ответ

5 голосов
/ 29 июля 2011

Полагаю, вы пытаетесь сделать что-то подобное.

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...