开发者

Expand path in TreeView using view model

开发者 https://www.devze.com 2023-04-07 16:43 出处:网络
I have dates bounded to TreeView. There is a wrapper class for date. Dates groups by years and months. Wrapper class also has IsSelected and IsExpanded properties:

I have dates bounded to TreeView. There is a wrapper class for date. Dates groups by years and months. Wrapper class also has IsSelected and IsExpanded properties:

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 of DateViewModel is used as ItemsSource for TreeView. Dates groups by 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:RadTreeVi开发者_如何学Cew.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>

The issue is: I need to expand full path to date using view model by setting IsExpanded property to true. But it doesn't have effect.

UPDATE:

Yes I created group descriptions in code. The code for expanding is simple:

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

There is missing code above.

Also I prepared test sample TreeViewGroupingSample.7z


Your TreeView is binding to CollectionViewSource.View.Groups, and those PropertyGroupDescription objects do not contain IsSelected or IsExpanded properties, so your TreeViewItem.IsSelected and TreeViewItem.IsExpanded values have an invalid binding

Your DatesViewModel.IsExpanded IS getting set to true with the code you are using. You can verify this by changing your Day template to show the value of IsExpanded

I would recommend creating classes for each tier (Year, Month, and Day), and having them all inherit from something like a TreeNodeBase class which contains properties for IsSelected, IsExpanded, and ObservableCollection<TreeNodeBase> Children. Don't forget to hook up a PropertyChange notification for your Children so that when TreeNodeBase.IsExpanded gets changed, the parent object's IsExpanded value changes too

0

精彩评论

暂无评论...
验证码 换一张
取 消