WPF:在MVVM中创建与未知类型的绑定的最佳方法

奥姆里·布蒂安(Omri Btian)

我正在寻找一种方法来显示DataGrid来自编译时未知类型的数据

我有以下基础课

public abstract class Entity
{
    // Some implementation of methods ...
}

在运行时,我加载了一个插件DLL,并使用反射来获取从派生的所有类型的列表Entity例如:

public class A : Entity
{
    public LocalAddress Address{ get; set; }
}

public class B : Entity
{
    public Vendor Vendor { get; set; }

    public string Name { get; set; }
}

然后我从数据库检索他们的实例列表

public IEnumerable<Entity> Entities { get; set; } // A list of instances of type A for example

Entities是DataGrid的ItemsSource,但是将属性绑定到的最佳方法是DataGrid什么?由于属性可能很复杂,因此我还需要能够绑定到特定路径,例如Address.HomeNum...

澄清说明

  1. 我只需要一次显示一个类型实例的网格。完整的方案是这样的:

    1. 我得到了Entity通过反射从插件DLL派生的类型的列表
    2. 我在列表中显示他们的名字。(在此示例中,列表将包含AB
    3. 当用户单击特定项目时,例如A,我A从DB中获得了一个实例列表-到目前为止,情况很好。
    4. 我想显示的该列表中A的实例DataGrid
    5. 当用户从列表中选择另一个项目(意味着另一种类型,假设B)时,我B从DB获得了的实例列表,需要在网格中显示这些实例,依此类推...
  2. 插件DLL是一个没有xamls的类库(我的用户也是制作此插件的用户,我不希望他们DataTemplate为自己的实体s。我也不能DataTemplate像我一样制作predifned s我不知道要等到运行时才显示的类型。每种类型可以具有不同的类型和数量的属性Entity

  3. 网格也应该是可编辑的。
Bizhan

由于您事先不知道Entities的属性名称,因此我认为最好的选择是将DataGrid保留在Xaml中,但将其DataGridColumns的定义和绑定移到后面的代码中。

AddColumnsForProperty(PropertyInfo property, string parentPath = "")
{
     var title = property.Name;
     var path = parentPath + (parentPath=="" ? "" : ".") + property.Name;

     if(property.PropertyType == typeof(string))
     {
        var column = new DataGridTextColumn();
        column.Header = title;
        column.Binding = new Binding(path);
        dataGrid.Columns.Add(column);
     }
     else if(property.PropertyType == typeof(bool))
     {
        //use DataGridCheckBoxColumn and so on
     }
     else
     {
          //...
     }

     var properties = property.GetProperties();
     foreach(var item in properties)
     {
          AddColumnsForProperty(item, path);
     }
}

现在,如果执行这些操作,则将填充dataGrid列。并通过在可观察的集合中添加所需类型的所有实例,并将其绑定到DataGrid的ItemsSource,它应该可以工作。selectedItem应该是从Entity派生的类之一的实例。列表框包含new A()new B()(或A和B的任何现有实例),因此在以下语句中可以使用selectedItem。

var propertyList = selectedItem.GetType().GetProperties();
foreach (var property in propertyList) 
    AddColumnsForProperty(PropertyInfo property);

如何在代码中编写DataGridColumnTemplate


编辑:

在这种情况下不能使用成员,因为INotifyPropertyChanged应该参与,所以我用属性替换了成员。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WPF MVVM与特定类型的绑定

来自分类Dev

在WPF应用程序的mvvm中实现导航的最佳方法

来自分类Dev

在WPF MVVM中绑定图像

来自分类Dev

MVVM WPF中的数据绑定

来自分类Dev

MVVM WPF中的数据绑定

来自分类Dev

什么是在WPF中自定义绑定文本的最佳方法

来自分类Dev

在MVVM中绑定ItemsControl的最佳实践

来自分类Dev

WPF MVVM UserControls的最佳做法。避免绑定问题

来自分类Dev

使用MVVM在WPF中绑定失败

来自分类Dev

MVVM中的WPF-TreeView数据绑定

来自分类Dev

在WPF中创建键绑定

来自分类Dev

WPF MVVM中的绑定多重绑定文本框

来自分类Dev

WPF,MVVM中的验证方法

来自分类Dev

在MVVM结构之后,如何在WPF中绑定方法而不是变量?

来自分类Dev

WPF MVVM数据绑定

来自分类Dev

WPF ComboBox Mvvm绑定

来自分类Dev

WPF mailto MVVM绑定

来自分类Dev

WPF中按钮的绑定方法

来自分类Dev

将动态创建的控件绑定到reactui中的属性的最佳方法是什么?

来自分类Dev

django创建多个类型用户的最佳方法

来自分类Dev

WPF MVVM将图像控件绑定到资源中的图像

来自分类Dev

ListView中的WPF,MVVM,EventBehaviourFactory,将事件绑定到命令

来自分类Dev

如何使用MVVM模式在WPF数据网格中绑定CurrentCell

来自分类Dev

如何在MVVM模式wpf中绑定StrokeDashArray属性

来自分类Dev

如何从ContextMenu绑定到MVVM中的WPF DataGridColumn?

来自分类Dev

WPF MVVM将图像控件绑定到资源中的图像

来自分类Dev

WPF MVVM应用程序中的DataGridComboBoxColumn绑定问题

来自分类Dev

WPF的TabItem的WebBrowser,MVVM的DataTemplate中的事件绑定

来自分类Dev

WPF:从 MVVM 中的视图模型绑定列表视图项源