Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEditableCollectionView在CommittedIt上丢失选择_C#_Wpf_Mvvm_Treeview_Observablecollection - Fatal编程技术网

C# IEditableCollectionView在CommittedIt上丢失选择

C# IEditableCollectionView在CommittedIt上丢失选择,c#,wpf,mvvm,treeview,observablecollection,C#,Wpf,Mvvm,Treeview,Observablecollection,我有CollectionViewSource,其中日期按年份和月份分组。日期显示在TreeView中(准确显示在RadTreeView中) 目标是在不重新创建视图的情况下更改所选日期(不要调用Refresh方法) 为此,我在日期视图模型中实现了IEditableObject,并将日期更改为: var selectedDate = SelectedDate; var editableCollectionView = Dates.View as IEditableCollectionView; i

我有
CollectionViewSource
,其中日期按年份和月份分组。日期显示在
TreeView
中(准确显示在
RadTreeView
中)

目标是在不重新创建视图的情况下更改所选日期(不要调用
Refresh
方法)

为此,我在日期视图模型中实现了
IEditableObject
,并将日期更改为:

var selectedDate = SelectedDate;

var editableCollectionView = Dates.View as IEditableCollectionView;
if (null != editableCollectionView && !editableCollectionView.IsEditingItem)
{
    editableCollectionView.EditItem(selectedDate);
    selectedDate.Date = dt.Date;
    editableCollectionView.CommitEdit();
}
但是在这种情况下,
TreeView
丢失了选择,我需要再次选择“selected item”,这将导致刷新绑定到所选日期的数据

我如何解决这个问题?完美地使用
MVVM
方式

更新:

若组中只有日期,则更改日期会导致包含该日期的项折叠

更新2:


可能我不应该使用SelectedDate属性,而只使用IsSelected和IsExpanded?

利用MVVM处理树状视图项

在项目级类中包括两个可写属性(用作单个树状视图项目的数据上下文)

  • 扩展
  • 当选
  • 已在上述两个属性的setter中实现INotifyPropertyChanged并引发属性更改通知

     <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        ....
     </...> 
    
    现在在
    TreeViewLevel
    中有一个绑定这些属性的样式

     <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        ....
     </...> 
    
    
    ....
    
    这样,只要在树状视图项的数据上下文中维护展开和选择,就可以在树状视图中维护展开和选择

    现在请记住,扩展状态可以对多个项目为true,但选择状态true仅适用于整个树状视图中的一个项目。


    希望这有帮助。

    我试过这种方法。但父视图模型如何知道子对象的属性是否已选择更改为true?我只能建议使用Prism的EventAggregator。这样做对吗?我不明白,你是说你的父母有一个扩展的分支,而其中一个被选中的深层子级是可见的。现在您对项目源进行了一些编辑,但“刷新”会删除扩展和选择?那么上述解决方案就是这种情况的完美解决方案。因为除非从展开的父视图到选定的子视图的整个分支在其数据上下文中是完整的,否则bracn将保持其展开和选择的确切状态。父视图模型是包含所有日期的视图模型。并且它需要具有选定的日期属性。当所选日期更改时,我加载绑定到它的数据。请参阅我的另一个问题以了解数据结构:。我所需要的一切:在左边的枣树上。右侧:绑定到选定日期的数据。当我在树中更改日期时-重新加载数据。当我使用DatePicker-change date in tree从数据更改日期时。是否使用
    DateTime
    class作为树视图项级数据上下文(…添加
    IsSelected
    \
    IsExpanded
    的建议在此DateTime类中…但除非您编写一个包装器,否则这是不可能的…类似于
    公共类MyDateTime:DateTime,INotifyPropertyChanged
    的内容,并且在该类中添加
    IsSelected
    IsExpanded
    。包装器存在。它是DayWorkInfoViewModel。它还包含用于分组的年和月属性。WorkViewModel包含DayWorkInfoViewModel的ObservableCollection作为字段,CollectionViewSource作为属性,还选择了DayWorkInfo作为绑定到TreeView的notify属性。