如何通过IEditableCollectionView编辑列表框项目

时间:2019-05-30 22:24:51

标签: c# wpf

我有一个ListBox,该ItemsSource绑定到ViewModel的ObservableCollection。 现在,我正在制作一个自定义cotrol,它应该处理ListBox个项目。 例如,向上/向下移动项目。 我无法使用ItemsSource,因为我希望该控件使用变量数据类型,而且我不知道它将是Type。 我所知道的关于ItemsSource类型的信息-将是IEnumerable。 因此,我编写了使用IEditableCollectionView交换相邻项目的属性值的代码。 如果ItemsSource是某个复杂类型ObservableCollection的{​​{1}},则效果很好。

ObservableCollection<Customers>

但是,如果private void ItemsSwapComplex(object originalSource, object originalDestination) { IEditableCollectionView items = ListBoxToManage.Items; Type type = originalSource.GetType(); // Create clones of Source and Destination // DOES NOT WORK WITH <string> dynamic cloneSource = Activator.CreateInstance(type); dynamic cloneDestination = Activator.CreateInstance(type); // Copy property values from Original to Clone PropertiesCopyComlex(originalSource, cloneSource); PropertiesCopyComlex(originalDestination, cloneDestination); // Copy new property values to the Source item items.EditItem(originalSource); object editSource = items.CurrentEditItem; PropertiesCopyComlex(cloneDestination, editSource); items.CommitEdit(); // Copy new property values to the Destination item items.EditItem(originalDestination); object editDestination = items.CurrentEditItem; PropertiesCopyComlex(cloneSource, editDestination); items.CommitEdit(); } private void PropertiesCopyComlex(object originalSource, object originalDestination) { foreach (var v in originalSource.GetType().GetProperties()) { v.SetValue(originalDestination, v.GetValue(originalSource)); } } 是简单类型的集合,例如ItemsSource-它会引发异常,表明ObservableCollection<string>没有构造函数。 而且我不明白如何使用string编辑简单的字符串IEditableCollectionView项目。 此代码完全不影响ListBox

ItemsSource

如何使用IEditableCollectionView items = ListBoxToManage.Items; items.EditItem(originalSource); object editSource = items.CurrentEditItem; editSource = "New string"; items.CommitEdit(); 编辑IEditableCollectionView的单个string项目?

更新:this post表示我的任务无法完成。必须为字符串使用包装器。对于我的特定任务-包装器必须实现ItemsSource,并且至少具有一个无参数的构造函数

1 个答案:

答案 0 :(得分:0)

  

如何使用IEditableCollectionView编辑ItemsSource的单个字符串项?

不能编辑System.String,因为它是不可变的,即创建后就不能对其进行修改。

Why .NET String is immutable?

如果您使用具有string属性的可变包装器,则确实可以修改包装器,但不能假定枚举数返回的每种类型T都是可变的。