2011-07-29 60 views
3

目前我正在開發一個應用程序,日期按年和月(內部組)分組。WPF CollectionViewSource的組屬性

我GOOGLE了一些例子關於TreeView分組,發現這樣的解決方案:我使用的日期一個普通列表爲SourceCollectionViewSource,定義組和排序,寫模板我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 
} 
+0

我找到了解決辦法:'Group'是'View'的屬性,而不是'CollectionViewSource'。正確的方法:'' –

回答

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

你的代碼運行良好,但是'TreeView'看起來像'ListBox' - 可展開的組沒有出現。 –

+1

XAML更新爲顯示羣組的樹節點 – anivas