【问题标题】:Combobox DisplayMemberPath from list<object>来自列表<object> 的组合框 DisplayMemberPath
【发布时间】:2019-04-30 15:44:07
【问题描述】:

我正在尝试将列表绑定到 ComboBox 并使用 displaymemberpath 来显示值。

这是我的 XAML:

<ComboBox x:Name="ComboBoxCommissieGroep" 
           ItemsSource="{Binding Commissies}" 
           DisplayMemberPath="CommissieGroep">

视图模型:

我的 ViewModel 检索“佣金”列表

private async Task LoadData()
{
    commissies = new ObservableCollection<object>(await LoginBLL.GetCommissiesList());
}

型号:

public class InloggenBO : ObservableObject
{
    private int lidNummer;

    public int LidNummer
    {
        get => lidNummer;
        set
        {
            lidNummer = value;
            NotifyPropertyChanged();
        }
    }

    private string commissieGroep;

    public string CommissieGroep
    {
        get => commissieGroep;
        set
        {
            commissieGroep = value;
            NotifyPropertyChanged();
        }
    }

    private string wachtwoord;

    public string Wachtwoord
    {
        get => wachtwoord;
        set
        {
            wachtwoord = value;
            NotifyPropertyChanged();
        }
    }
}

我的代码数据库方法: 该方法创建已从数据库中检索到的数据集列表。这就是为什么它是 object 类型而不是 InloggenBO

protected Task<List<object>> ExecuteReader(string SqlString)
{
    // Read to dataset
    DataSet dataset = new DataSet();

    using (var conn = new SqlConnection(ConnectionString))
    using (var adapter = new SqlDataAdapter(new SqlCommand(SqlString, conn)
    {
        // Set commandtype
        CommandType = CommandType.Text
    }))
    {
        // Open connection
        conn.Open();
        // Fill dataset
        adapter.Fill(dataset);
        // Close connection
        conn.Close();
    }

    return Task.FromResult(ToList(dataset));
}

创建列表对象的方法

private List<object> ToList(DataSet dataSet)
{
    var list = new List<object>();

    foreach (var dataRow in dataSet.Tables[0].Rows)
    {
        list.Add(dataRow);
    }
    return list;
}

我已将我的 DataContext 设置为视图模型,并且我知道绑定有效,因为在我的组合框中没有显示成员路径它说:“System.Data.Datarow”。那么我必须在 displaymemberpath 中放入什么才能显示它的值?

【问题讨论】:

  • 为什么你的 ObservableCollection 类型对象应该是 InloggenBO 类型?
  • 同样在您的 XAML 中,您绑定到 Commissies,但您的虚拟机有一个名为 commissies 的属性(我假设)
  • @auburg 我编辑了关于如何检索数据的问题,以便您知道为什么我有一个 Object 类型的 ObservableCollection
  • 您的ToList(dataset) 似乎返回了List&lt;DataRow&gt; - 那么为什么DataRow 对象应该知道您的InloggenBO 类的任何信息?
  • 因为您绑定到一个普通对象,所以没有 CommissieGroep 属性。您应该绑定到具有该属性名称的对象列表才能使其工作。

标签: c# wpf mvvm data-binding binding


【解决方案1】:

您可以将 ToList 方法更改为:

private List<InloggenBO> ToList(DataSet dataSet)
{
    //new list of InloggenBO instead of objects
    var list = new List<InloggenBO>();

    foreach (var dataRow in dataSet.Tables[0].Rows)
    {
        //create a new instance of InloggenBO
        var item = new InloggenBO();
        //this assumes that the column is named as the member
        item.CommissieGroep = dataRow["CommissieGroep"].ToString(); 
        //fill the other members

        //add the instane of InloggenBO to the list
        list.Add(item);
    }

    return list;
}

但是,正如@Andy 所说,您应该考虑使用像实体框架这样的 ORM。

【讨论】:

    【解决方案2】:

    系统完成的绑定过程分两部分完成。第一部分是一个目标对象,我的意思是 object 因为它不知道,该对象由控件的DataContext 提供。

    如果 I 控件没有设置 DataContext,它会继承 XAML 中指定的父控件,如果它也是 null,则该过程会自行重复,直到最终获取页面的数据上下文。

    绑定的第 2 步是当该对象不为 null 时,它会从绑定语句本身中给出的绑定 hint 反映到 属性


    因此,在您的情况下,它正在从数据上下文中寻找一个名为 Commissies 的属性。如果该属性不为 null 并且是一个列表,则成功绑定到列表后的组合框会尝试在要显示的每一行中查找并显示名为 CommissieGroep 的属性。

    在 Combobox 的情况下,必须符合三项才能正确显示数据。

    您似乎没有正确的类型列表(或可观察的列表)来进行正确的数据绑定和显示;修复它将解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2021-03-18
      • 2011-07-30
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多