gpt4 book ai didi

c# - WPF CollectionViewSource 的组属性

转载 作者:行者123 更新时间:2023-11-30 15:07:12 39 4
gpt4 key购买 nike

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

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

工作示例(但仅适用于一组嵌套)包括这样的代码:

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

因为我使用 MVVM 模式,所以我定义了 CollectionViewSource作为 View 模型的属性(而不是资源)。

可能是我站错了脚,但我无法移植上面的代码,我试过了:

<TreeView ItemsSource={Binding Path=CVS.Groups} /> ,所以:

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

我做错了什么?

更新:

完整源代码:

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

最佳答案

我猜你正在尝试做这样的事情。

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>

关于c# - WPF CollectionViewSource 的组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6869958/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com