我有一个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
,并且至少具有一个无参数的构造函数
答案 0 :(得分:0)
如何使用
IEditableCollectionView
编辑ItemsSource
的单个字符串项?
您不能编辑System.String
,因为它是不可变的,即创建后就不能对其进行修改。
如果您使用具有string
属性的可变包装器,则确实可以修改包装器,但不能假定枚举数返回的每种类型T
都是可变的。