2011-09-27 4 views
4

나는 TreeView에 묶인 날짜가 있습니다. 날짜에 대한 래퍼 클래스가 있습니다. 날짜와 연도 그룹. 래퍼 클래스는에 isSelected 및으로 IsExpanded 속성이 있습니다 DateViewModel의뷰 모델을 사용하여 TreeView의 경로를 확장하십시오.

public sealed class DateViewModel : NotificationObject, IEditableObject 
{ 
    #region properties 

    bool _isSelected; 

    public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      if (_isSelected != value) 
      { 
       _isSelected = value; 
       RaisePropertyChanged(() => IsSelected); 
      } 
     } 
    } 


    bool _isExpanded; 

    public bool IsExpanded 
    { 
     get 
     { 
      return _isExpanded; 
     } 
     set 
     { 
      if (_isExpanded != value) 
      { 
       _isExpanded = value; 
       RaisePropertyChanged(() => IsExpanded); 
      } 
     } 
    } 

    DateTime _date; 

    public DateTime Date 
    { 
     get 
     { 
      return _date; 
     } 
     set 
     { 
      if (_date != value) 
      { 
       _date = value; 

       RaisePropertyChanged(() => Date); 
       RaisePropertyChanged(() => Year); 
       RaisePropertyChanged(() => Month); 
       RaisePropertyChanged(() => MonthName); 
       RaisePropertyChanged(() => 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 
} 

ObservableCollection에이 트 리뷰에 대한 ItemsSource로 사용됩니다. CollectionViewSource ANS DataTemplates에 의해 그룹 날짜 :

<DataTemplate x:Key="DayTemplate"> 
    <TextBlock x:Name="textBlock" 
       FontSize="14" 
       Text="{Binding Path=Day}" /> 
</DataTemplate> 

<HierarchicalDataTemplate x:Key="MonthTemplate" 
          ItemsSource="{Binding Path=Items}" 
          ItemTemplate="{StaticResource DayTemplate}"> 
    <TextBlock Text="{Binding Path=Name}" /> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate x:Key="YearTemplate" 
          ItemsSource="{Binding Path=Items}" 
          ItemTemplate="{StaticResource MonthTemplate}"> 
    <TextBlock> 
     <Run Text="{Binding Path=Name, Mode=OneWay}" /> 
     <Run Text="y" /> 
    </TextBlock> 
</HierarchicalDataTemplate> 

<telerik:RadTreeView Grid.Row="1" 
      ItemsSource="{Binding Path=Dates.View.Groups}" 
      ItemTemplate="{StaticResource YearTemplate}">   
    <telerik:RadTreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type telerik:RadTreeViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> 
      <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" /> 
     </Style> 
    </telerik:RadTreeView.ItemContainerStyle> 
</telerik:RadTreeView> 

문제는 : 내가 참으로 IsExpanded 속성을 설정하여보기 모델을 사용하여 현재까지의 전체 경로를 확장해야합니다. 하지만 효과가 없습니다.

업데이트 :

는 그래, 난 코드 그룹의 설명을 만들었습니다. 확장 코드는 간단합니다.

public sealed class DatesViewModel 
{ 
    ObservableCollection<DateViewModel> _dates = new ObservableCollection<DateViewModel>(); 
    public CollectionViewSource Dates {get; set;} 

    public DatesViewModel() 
    { 
     Dates = new CollectionViewSource { Source = _dates } ; 

     // add groups, sorts and fill collection 
     ... 
    } 

    // Just a sample 
    public void ExpandFirstDate() 
    { 
     _dates[0].IsExpanded = true; 
    } 
} 

위 코드가 누락되었습니다.

또한 나는 시험 시료가 원하는 TreeViewCollectionViewSource.View.Groups에 구속력 TreeViewGroupingSample.7z

+0

John 돌아 오신 것을 환영합니다! 실제로 무슨 일이 일어나고있는거야? 전혀 확장되지 않습니까? –

+0

@AngelWPF : 안녕하세요. 즉, 현재 선택한 항목으로 전체 경로를 확장하는 방법입니다. CollectionViewGroupInternal에는 IsExpanded 속성이 없습니다. –

+0

이렇게 GroupDescriptions을 추가 했습니까? 'Dates.View.GroupDescriptions.Add (새 GroupDescription ("Year")); Dates.View.GroupDescriptions.Add (새 GroupDescription ("Month")); Dt.View.GroupDescriptions.Add (새 GroupDescription ("Day")); ' –

답변

2

을 준비하고, 그 PropertyGroupDescription 객체는 그래서 당신의 TreeViewItem.IsSelectedTreeViewItem.IsExpanded 값이 무효가

DatesViewModel.IsExpanded가 귀하의 바인딩이, IsSelected 또는 IsExpanded 속성을 포함하지 않는 사용중인 코드로 true로 설정됩니다. 일 템플릿을 변경하여 IsExpanded

각 계층 (연도, 월, 일)에 대한 클래스를 만들고 속성이 포함 된 클래스 TreeNodeBase 클래스로부터 상속받는 것이 좋습니다. IsSelected, IsExpandedObservableCollection<TreeNodeBase> Children. Children에 대한 PropertyChange 알림을 잊지 마시고 TreeNodeBase.IsExpanded이 변경되면 부모 개체의 IsExpanded 값도 변경됩니다

+0

기본 클래스에 대해서도 생각했지만 가능하면 간단하게 유지하려고했습니다. –

+0

'IsSelected'와'IsExpanded'에서 양방향 바인딩을 원한다면 각 계층 (연, 월, 일)에 해당 값을 저장하는 객체가 필요합니다. 나는 3 개의 객체를 생성하는 것보다 그 3 개의 객체를위한 기본 클래스를 만드는 것이 훨씬 더 간단하다는 것을 알게 될 것이다. 3x – Rachel

+0

나는 이러한 솔루션을 의미했다. 근래에 나는 너무 많은 코드를 작성했다는 것을 알기 시작했다. 표준 WPF 선물을 사용하지 마십시오. –

관련 문제