Связывание поля со списком WPF с внешним источником

У меня проблема с привязкой данных на ComboBox. В поле со списком не отображаются изначально установленные элементы.

Мой .xaml:

<ComboBox 
    Name = "LeaderTextBox" 
    Grid.Column = "6" 
    Grid.Row = "2"  
    MinWidth = "150" 
    SelectedItem = "{Binding Path=ProjectLeader}" 
    DisplayMemberPath = "Name" Margin = "5" 
    />

В коде я установил ItemSource так:

LeaderTextBox.ItemsSource = service.GetAllEmployee();

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

Моя проблема в том, что если у меня установлено значение для ProjectLeader, оно не отображается. Что мне там не хватает?


Модель для справки:

[Serializable]
[DataContract(Namespace = "Shared", IsReference = true)]
public class Employee
{
    public Employee()
    {
        this.Projects = new List<Project>();
    } 

    [DataMember]
    public int? ID { get; set; }

    [DataMember]
    public String Name { get; set; }

    [DataMember]
    public String JobDescription { get; set; }

    [DataMember]
    public String Department { get; set; }

    [DataMember]
    public String DirectDialing { get; set; }

    [DataMember]
    public bool Status { get; set; }

    [DataMember]
    public virtual Project LeaderOfProject { get; set; }

    [DataMember]
    public virtual List<Project> Projects { get; set; }

    public override string ToString()
    {
        return ID + " " + Name + " " + JobDescription + " " + Department + " " + DirectDialing;
    }


}
[Serializable]
[DataContract(Namespace = "Shared", IsReference = true)]
public class Project
{

    public Project()
    {
        this.EmployeesWorkingOnProject = new List<Employee>();
        this.ProjectSteps = new List<ProjectStep>();
    }

    [DataMember]
    public int? ID { get; set; }

    [DataMember]
    public String Titel { get; set; }

    [DataMember]
    public DateTime StartDate { get; set; }

    [DataMember]
    public DateTime EndDate { get; set; }

    [DataMember]
    public String Description { get; set; }

    [DataMember]
    public Employee ProjectLeader { get; set; }

    [DataMember]
    public bool Status { get; set; }

    [DataMember]
    public virtual List<Employee> EmployeesWorkingOnProject { get; set; }

    [DataMember]
    public virtual List<ProjectStep> ProjectSteps { get; set; }

    public override string ToString()
    {
        return ID +" "+ Titel+" "+StartDate+ " "+ EndDate +" "+ Description;
    }

}

Что такое ProjectLeader? Чтобы SelectedItem работал здесь, это должно быть имя свойства вашего объекта DataContext, значением которого должен быть объект типа Employee, который должно быть содержится в коллекции объектов, возвращаемых service.GetAllEmployee(). Не просто «имеет тот же идентификатор», но и фактический экземпляр должен быть там. То, как вы заполняете список, кажется маловероятным.

15ee8f99-57ff-4f92-890c-b56153 14.05.2018 21:40

Я бы посоветовал сделать коллекцию сотрудников свойством модели просмотра, тогда модель просмотра сможет сканировать коллекцию на предмет Родольфо Допамина или кого-то еще и назначить его фактический экземпляр Employee для ProjectLeader. Или выберите SelectedValue / SelectedValuePath = "ID".

15ee8f99-57ff-4f92-890c-b56153 14.05.2018 21:43

@EdPlunkett Мне очень жаль, но я не совсем понимаю, что вы имеете в виду под SelectedValue/SelectedValuePath = "ID". Я пробовал SelectedValue = "{Binding Path=ProjectLeader.ID}" SelectedValuePath = "ID" и SelectedValue = "{Binding Path=ProjectLeader}" SelectedValuePath = "ID", но безуспешно. Не могли бы вы привести пример, как это решить?

XtremeBaumer 14.05.2018 21:55

Вы читали документация по ComboBox.SelectedValue (Selector - это общий базовый класс для ComboBox, ListBox и т. д.)? Это тоже может помочь. Вы должны понять, что это значит.

15ee8f99-57ff-4f92-890c-b56153 14.05.2018 22:01

@EdPlunkett Я все прочитал и понимаю проблему (значение, которое я хочу отобразить, не такое, как в списке, который я установил как ItemSource), но я до сих пор не знаю, как это исправить

XtremeBaumer 14.05.2018 22:23

Какой объект «Сотрудник» вы хотите выбрать изначально?

mm8 15.05.2018 12:05

@ mm8 либо ничего, если Project.ProjectLeader равен нулю, либо правильный Project.ProjectLeader, если он установлен

XtremeBaumer 15.05.2018 12:49

@XtremeBaumer: Где и как создать экземпляр класса Project?

mm8 15.05.2018 15:45

@ mm8 в этом случае всегда выбирается из базы данных. У меня также есть случай, когда я создаю new Project(), но нет необходимости устанавливать ProjectLeader

XtremeBaumer 15.05.2018 15:51

Вы привязываетесь к свойству ProjectLeader в своем XAML ... где это свойство определено и установлено?

mm8 15.05.2018 15:52

@ mm8 определен в классе Project. Сопоставление выполняется через EF (отлично работает для выбора)

XtremeBaumer 15.05.2018 15:53

Опять же, где определен этот экземпляр Project? Разместите свой код, если вам нужна помощь. Где вы устанавливаете значение, которое будет выбрано в ComboBox?

mm8 15.05.2018 15:54
Where do you set the value to be selected in the ComboBox -> прочтите вопрос. Но какое это вообще имеет значение? Четко указано, чего я хочу достичь (1 POCO и список других POCO как ItemSource)
XtremeBaumer 15.05.2018 15:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
217
1

Ответы 1

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

Верно:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var paul = new Employee { Name = "Paul" };
        LeaderTextBox.ItemsSource = new List<Employee>()
        {
            new Employee {Name = "Bob" },
            paul,
            new Employee {Name = "Alex" },
        };
        ProjectLeader = paul;
    }

Неправильный:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        LeaderTextBox.ItemsSource = new List<Employee>()
        {
            new Employee {Name = "Bob" },
            new Employee { Name = "Paul" },
            new Employee {Name = "Alex" },
        };
        ProjectLeader = new Employee {Name = "Paul" };
    }

Я уже понял этот вопрос. Прямо сейчас ищу способ сделать это автоматически

XtremeBaumer 14.05.2018 22:29

затем вам нужно выбрать руководителя проекта «из» списка, назначенного источнику элементов.

Bizhan 14.05.2018 22:35

Другие вопросы по теме