如何将WPF数据网格绑定到动态项列表

时间:2018-03-15 08:30:18

标签: c# wpf datagrid

我正在使用VS2015和WPF进行视图,其中我有一个下拉列表,其中包含一个视图名列表(位于我的MySQL数据库中),用于选择一个数据搜索视图和一个用于显示结果的数据网格来自搜索的数据。

通常我们正在使用Entity Framework并将List与某个实体(表或视图)的类型一起用作datagrids的源。

但在这种情况下,我们必须进行动态搜索。

所以我在代码隐藏中创建了一个与MySQL数据库的连接,并将所选数据中的所有数据读入一个由MVVM绑定到数据网格的DataTable对象。

不幸的是,数据网格需要一个过滤器,用户可以在其中输入参数以过滤数据网格中的结果。

如果没有过滤器我的数据表解决方案工作正常,但使用过滤器会导致错误。

所以我试着制作 - 根据我们正常使用的实体列表 - 根据这篇文章从搜索数据表中的动态对象列表:

https://softwareengineering.stackexchange.com/questions/93322/generating-a-class-dynamically-from-types-that-are-fetched-at-runtime

好消息是:我已经没有过滤器了。

坏消息是:我在数据网格中看到很多黑线,没有数据。

我做错了什么? 任何帮助将不胜感激。

这是我的代码。首先是数据网格源的字段和属性:

private List<dynamic> viewDataItemsList = new List<dynamic>();
public List<dynamic> ViewDataItemsList
{
    get { return viewDataItemsList; }
    set
    {
        viewDataItemsList = value;
        OnPropertyChanged("ViewDataItemsList");
    }
}

然后我用于搜索的代码:

public void ReadDataFromSelectedView(string viewName)
{
    // Creates MySQL-connection without EntityFramework and reads data from the selected view
    var db = new paragraph16Entities();
    string connectionString = db.Database.Connection.ConnectionString;
    var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionString);
    MySql.Data.MySqlClient.MySqlCommand cmd = conn.CreateCommand();
    cmd.CommandTimeout = 60000;
    conn.Open();
    cmd.CommandText = "SELECT * FROM " + viewName;
    cmd.ExecuteNonQuery();
    var dataTable = new DataTable();
    var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd);
    da.Fill(dataTable);
    var cb = new MySql.Data.MySqlClient.MySqlCommandBuilder(da);
    Console.WriteLine("");
    conn.Close();
    ViewData = dataTable;

    // Tries to create a list of dynamic objects a source for the datagrid
    List<dynamic> itemsList = new List<dynamic>();
    DynamicEntity viewDataItem;
    dynamic item;
    foreach (DataRow row in dataTable.Rows)
    {
        var values = new Dictionary<string, object>();
        foreach (DataColumn column in dataTable.Columns)
        {
            values.Add(column.ColumnName, row[column.ColumnName]);
        }
        viewDataItem = new DynamicEntity(values);
        item = viewDataItem;
        itemsList.Add(item);
    }
    ViewDataItemsList = itemsList;
    testEvaluationView.grdTestData.Items.Refresh();
}

这是datagrid的XAML定义:

<DataGrid Name="grdTestData"
          Grid.Column="0"
          HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
          filter:DataGridExtensions.UseBackgroundWorkerForFiltering="True"
          filter:DataGridExtensions.IsClearButtonVisible="False"
          filter:DataGridExtensions.IsFilterVisible="True"
          ColumnHeaderStyle="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type filter:DataGridHeaderFilterControl},ResourceId=DataGridHeaderFilterControlStyle}}"
          ItemsSource="{Binding ViewDataItemsList, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          Margin="5"
          CanUserAddRows="False"
          IsReadOnly="True">
</DataGrid>

最后是DynamicEntity类:

public class DynamicEntity : DynamicObject
{
    private IDictionary<string, object> _values;

    public DynamicEntity(IDictionary<string, object> values)
    {
        _values = values;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (_values.ContainsKey(binder.Name))
        {
            result = _values[binder.Name];
            return true;
        }
        result = null;
        return false;
    }
}

0 个答案:

没有答案