我有 CollectionViewSource
,其中日期按年和月分组。日期显示在 TreeView
中(准确地说是在 RadTreeView
中)。
目标是在不重新创建 View 的情况下更改选定的日期(不要调用 Refresh
方法)。
为此,我在日期 View 模型中实现了 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
丢失了选择,我需要再次选择“所选项目”,这会导致刷新数据到所选日期。
我该如何解决这个问题?完美地使用 MVVM
方式。
更新:
如果日期在组中是单独的,更改日期会导致折叠包含它的项目。
更新 2:
也许我不应该使用 SelectedDate 属性而只使用 IsSelected 和 IsExpanded?
最佳答案
为 TreeView 项目利用 MVVM。
在您的项目级别类中包含两个可写属性(用作您的单个 TreeView 项目的数据上下文)
- 展开
- 已选中
是否已实现 INotifyPropertyChanged 并在上述两个属性的 setter 中引发属性更改通知。
现在 TreeViewLevel
有一个绑定(bind)这些属性的 Style。
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
....
</...>
通过这种方式,只要在 TreeView 项的数据上下文中进行扩展和选择,就会在 TreeView 上进行维护。
现在请记住,展开状态可以对多个项目为真,但选择状态为真仅适用于整个 TreeView 中的一个项目。
希望这对您有所帮助。
关于c# - IEditableCollectionView 在 CommitEdit 上失去选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563970/