2011-07-29 13 views
3

現在、私は日付を年と月(内部グループ)でグループ化するアプリケーションを開発しています。WPF CollectionViewSourceのグループプロパティ

私はTreeViewにグループ化についてのいくつかの例をGoogleで検索して、そのような解決策を見つけた:私はそうで私のTreeViewとするためのテンプレートを作成し、CollectionViewSourceためSourceとして日付のプレーンなリストを使用するグループと種類を定義します。

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

操作例(しかし唯一のグループの入れ子の場合)は、そのようなコードを含みます。

私はMVVMパターンを使用しているので、ビューモデルのプロパティ(リソースではない)としてCollectionViewSourceを定義します。

<TreeView ItemsSource={Binding Path=CVS.View} />が、それは動作しません:

<TreeView ItemsSource={Binding Path=CVS.Groups} />など:

は私が間違って足に立ったが、私はポート上記のコードをできなかったことが、私はそうしようとしました。 CollectionViewSourceには、プロパティGroupがありません。

私は間違っていますか?

UPDATE:

完全なソースコード:DayWorkInfoViewModel.csで

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

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で

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> 

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

私は解決策を見つけた: 'Group'はない' 'CollectionViewSource' View'の財産です。正しい方法: '' –

答えて

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

終了しません。私はソースコードで質問を更新しました。 –

+0

あなたのコードは正常に動作しますが、 'TreeBox'は' ListBox'のように見えます - 折りたたみ可能なグループは表示されません。 –

+1

グループのツリーノードを表示するためにXAMLが更新されました – anivas