Combobox DisplayMemberPath из списка <object> - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь привязать список к ComboBox и использовать displaymemberpath для отображения значений.

Это мой XAML:

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

ViewModel:

Моя ViewModel получает список "Commissies"

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();
        }
    }
}

Мой метод базы данных кода: метод создает список набора данных, который был извлечен из базы данных.Вот почему это объект типа, а не 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 для модели представления, и я знаю, что привязка работаетпотому что в моем поле со списком без displaymemberpath он говорит: "System.Data.Datarow".Так что я должен вставить в displaymemberpath, чтобы я мог показать его значение?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Процесс привязки, выполняемый системой, состоит из двух частей.Первая часть относится к целевому объекту, и я имею в виду объект для его неизвестного ему, этот объект предоставляется DataContext элемента управления.

Если у элемента управления нет набора DataContext, он наследует родительский элемент управления, как указано в XAML, и если он также равен нулю, этот процесс повторяется до тех пор, пока, в конечном счете, не будет взят текст данных страницы.

Шаг 2 привязки, когда этот объект не равен нулю, он затем отражает свойство из привязки подсказка , заданной в самом операторе привязки.


Итак, в вашем случае он ищет свойство с именем Commissies вне контекста данных.Если это свойство не равно нулю и является списком, выпадающий список после успешной привязки к списку затем пытается найти и показать свойство с именем CommissieGroep в каждой строке, которая будет отображаться.

Что в случаеВ выпадающем списке есть три вещи, которые должны быть в очереди для правильного отображения данных.

Похоже, что у вас нет правильного списка (или наблюдаемого списка) типов, которые, как ожидается, будут обеспечивать надлежащее связывание и отображение данных;исправление, которое решит проблему.

0 голосов
/ 29 ноября 2018

Вы можете изменить свой 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, подобного Entity Framework.

...