c# - IEditableCollectionView 在 CommitEdit 上失去选择

标签 c# wpf mvvm treeview observablecollection

我有 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 项目的数据上下文)

  1. 展开
  2. 已选中

是否已实现 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/

相关文章:

c# - itext7 中的 htmlConverter 在我希望它在 C# 中关闭之前关闭 pdf 文档

c# - 将模型中的项目传递给部分 View 不起作用 ASP.NET MVC 5

wpf - 使用Caliburn.Micro时用于多个控件的相同方法

c# - 将自定义命令设置为以编程方式创建的按钮

c# - MVVM打开窗口,同时保持 View 和 View 模型分离

c# - 在 c# asp.net 中执行 javascript 后抓取网页

C# 为什么我不应该使用协程?

c# - 自动调整控件问题

c# - 使用 TPL 和进程外 COM 服务器的 C# WPF 应用程序出现奇怪问题

c# - WPF 应用程序 : Controls look like . NET 2.0 中的 WinForms 对话框