C# 在ListView中显示和编辑各种项目类型

C# 在ListView中显示和编辑各种项目类型,c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,我在ListView中显示两种类型的项目: abstract class Item { string ID { get; } } class ItemTypeA : Item { string Value { get; set; } } class ItemTypeB : Item { string ValueOne { get; set; } string ValueTwo { get; set; } } (当然,它们没有更多的功能,它们使用各种接口,但为

我在ListView中显示两种类型的项目:

abstract class Item
{
    string ID { get; }
}

class ItemTypeA : Item
{
    string Value { get; set; }
}

class ItemTypeB : Item
{
    string ValueOne { get; set; }
    string ValueTwo { get; set; }
}
(当然,它们没有更多的功能,它们使用各种接口,但为了举例,我省略了这一点,只展示了这些类型的“最终”结构)

因此,基本上在ListView中,总是有一个ID列,其他列取决于项目类型

我正在考虑在
ListView.View
GridView
中使用某种动态列,底层视图模型将在其中确定应显示哪些列(或给定项目类型的属性)

编辑也是如此-编辑区域中应该只有一个
文本框用于ItemTypeA,两个用于ItemTypeB

所以基本上,我的问题是,如何解决这个问题,同时尽量避免为每个项目类型创建完全独立的视图(使用ListView和edit area)

另外,我希望避免直接在ListView中编辑项目,因为项目值有时可能包含大量文本(甚至多行文本),这对于用户来说很难编辑


(我正在使用Caliburn.Micro,但这与问题不太相关)。

您可以为ListViewItem提供自己的DataTemplateSelector:

public class MyTemplateSelector : DataTempolateSelector
{
     public override DataTemplate SelectTemplate(object item, DependencyObject container)
     {
        // here select temaplate, from dictionary for example, using item.GetType()
     }
}
您的项目视图模型类:

abstract class Item
{
    string ID { get; }

    MyTemplateSelector TemplateSelector { get; }
}
您的ListViewItem样式:

您可以将第二列的设置为适当的值。类似地,您可以使用ContentPresenter,并为编辑区域设置适当的值。但我不希望在ListView中将
ItemTypeB
显示为ValueOne和ValueTwo的复合值。当在ListView中显示ItemTypeB项时,我需要两个附加列(ValueOne和ValueTwo),当显示ItemTypeA项时,只需要一个附加列(Value)。仅需方向。。。我认为您的VM应该包含原始列表中最大列数的属性,以及每个原始项返回ienumerable的列表属性,其中项对应的属性数