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

标签 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; }
}

(当然,它们没有更多的东西,它们使用各种接口(interface),但为了举例,我把它省略了,只展示了这些类型的“最终”结构)

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

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

编辑也是如此 - 应该只有一个 TextBox对于 元素类型A 两个用于 元素类型B 在编辑区。

所以基本上,我的问题是,如何解决这个问题,同时尽量避免为每个项目类型制作完整的单独 View (带有 ListView 和编辑区域)。

另外,我想避免直接在 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()
     }
}

您的项目 View 模型类:
abstract class Item
{
    string ID { get; }

    MyTemplateSelector TemplateSelector { get; }
}

您的 ListViewItem 样式:

关于c# - 在 ListView 中显示和编辑各种项目类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15843790/

相关文章:

wpf - 为什么 TreeView 之间/内部的 Tab 键顺序不起作用?

java - 启用 html 的 android ListView

c# - 将 ViewModel 引用传递给另一个 ViewModel(绑定(bind)到 View 的同一引用)?

c# - 如何衡量应用程序的性能?

c# - WPF + Caliburn 微 : how to catch Window Close event?

c# - 为什么 SourceUpdated 事件不触发我在 WPF 中的图像控件?

delphi - 如何在 ListView 中省略空单元格的网格线?

android - 使用自定义适配器时,ListView 不会使用主题设置样式

c# - Utility/Helper 无状态静态类与无状态非静态类

c# - 什么事情会触发 Visual Studio 重新生成 *.Designer.cs 文件?