【问题标题】:binding observable collection of custom objects containing array绑定包含数组的自定义对象的可观察集合
【发布时间】:2018-03-20 09:23:03
【问题描述】:

我正在学习 wpf 和绑定,我有一个 gridview 和一个自定义对象

我正在尝试将自定义对象列表绑定到网格我的自定义对象是这样设计的

 Public class myObject 
  {
    protected int myInt {get; set;}
    protected ObservableCollection<string> myStrings{get;set;}
    protected double myDouble{get;set}

    public myObject(int aInt, string aString, double aDouble)
   {
    myStrings = new ObservableCollection<string>(); 
    string[] substrings = aString.split('/');
    this.myInt = aInt;


     foreach (string s in substrings)
     {
         myStrings.Add(s);
     }

     this.myDouble = aDouble;
    }

}

然后我创建这些对象的 observablecollection 并将它们绑定到网格

双精度整数在网格中显示得很好,但数组显示指针, 我有一列充满了

  "System.Collections.ObjectModel.ObservableCollection `1[System.String]" 

谁能帮我在网格中显示 observableCollection 的内容,例如,集合的每个项目都会得到一列。

提前致谢!

我找到的解决方案

我尝试使用模板,但它并不让我满意,所以我使用了 ExpandoObjects 我首先创建了一个字典列表,其中包含我未来网格的每一行,然后使用 https://theburningmonk.com/2011/05/idictionarystring-object-to-expandoobject-extension-method/ 将它们转换为 expando 对象非常感谢他出色的自定义方法

然后我只是将 ExpandoObjects 的可观察集合绑定到我的 radgridview 和 TADA 我现在有了我的动态网格和动态对象

再次感谢您的回答,我学到了一些关于模板的有用信息!

【问题讨论】:

  • 计划如何运作?列标题应该是什么?如何处理不同大小的集合?我至少可以说,这不是开箱即用的。
  • 您的 myStrings 集合中的所有 myObject 项的项数是否相同?
  • 无关:建议关注C# naming conventions
  • 实际上,在这种情况下,double/int 和字符串都不能显示。您将它们标记为受保护。 WPF 绑定要求属性是“公共的”才能绑定到它们
  • 它们实际上在我的代码中是公开的,只是认为这不适合封装,所以当我为这篇文章重写我的代码时,我让它们受到保护。但是阅读了你所有的 cmets,我意识到这不会奏效。我可以代替一个字符串数组声明尽可能多的字符串,这样可以解决问题,但我不会满意,我正在搜索动态对象,不知道这是否可以帮助我解决我的问题。

标签: c# wpf mvvm expandoobject dynamicobject


【解决方案1】:

在您的情况下看起来更合适的是使用RowDetailsTemplate 定义一个子DataGrid/GridView 来显示字符串集合,将字符串集合显示在与其他属性相同的级别可能是一项艰巨的任务去做(并且没有多大意义)。 这里是如何在另一个中定义DataGrid 的示例(使用GridView/ListViewDataGrid 看起来更合适)。

 <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="MyInt" Binding="{Binding  MyInt}"/>
            <DataGridTextColumn Header="MyDouble" Binding="{Binding  MyDouble}"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
               <ListView ItemsSource="{Binding MyStrings}"/>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

我的对象

public class MyObject
{
    public int MyInt { get; set; }
    public ObservableCollection<string> MyStrings { get; set; }
    public double MyDouble { get; set; }

    public MyObject(int aInt, string aString, double aDouble)
    {
        MyStrings = new ObservableCollection<string>();
        string[] substrings = aString.Split('/');
        this.MyInt = aInt;


        foreach (string s in substrings)
        {
            MyStrings.Add(s);
        }

        this.MyDouble = aDouble;
    }

}

【讨论】:

  • 另外,正如上面cmets中所指定的,属性应该是Public,以便能够绑定它们。
  • 还应包括INotifyPropertyChanged 的实现。
  • @XAMlMAX 确实
猜你喜欢
  • 2017-11-25
  • 2012-04-28
  • 1970-01-01
  • 2020-06-05
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2015-03-05
相关资源
最近更新 更多