У меня проблема с привязкой данных на 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;
}
}
Я бы посоветовал сделать коллекцию сотрудников свойством модели просмотра, тогда модель просмотра сможет сканировать коллекцию на предмет Родольфо Допамина или кого-то еще и назначить его фактический экземпляр Employee для ProjectLeader. Или выберите SelectedValue / SelectedValuePath = "ID".
@EdPlunkett Мне очень жаль, но я не совсем понимаю, что вы имеете в виду под SelectedValue/SelectedValuePath = "ID". Я пробовал SelectedValue = "{Binding Path=ProjectLeader.ID}" SelectedValuePath = "ID" и SelectedValue = "{Binding Path=ProjectLeader}" SelectedValuePath = "ID", но безуспешно. Не могли бы вы привести пример, как это решить?
Вы читали документация по ComboBox.SelectedValue (Selector - это общий базовый класс для ComboBox, ListBox и т. д.)? Это тоже может помочь. Вы должны понять, что это значит.
@EdPlunkett Я все прочитал и понимаю проблему (значение, которое я хочу отобразить, не такое, как в списке, который я установил как ItemSource), но я до сих пор не знаю, как это исправить
Какой объект «Сотрудник» вы хотите выбрать изначально?
@ mm8 либо ничего, если Project.ProjectLeader равен нулю, либо правильный Project.ProjectLeader, если он установлен
@XtremeBaumer: Где и как создать экземпляр класса Project?
@ mm8 в этом случае всегда выбирается из базы данных. У меня также есть случай, когда я создаю new Project(), но нет необходимости устанавливать ProjectLeader
Вы привязываетесь к свойству ProjectLeader в своем XAML ... где это свойство определено и установлено?
@ mm8 определен в классе Project. Сопоставление выполняется через EF (отлично работает для выбора)
Опять же, где определен этот экземпляр Project? Разместите свой код, если вам нужна помощь. Где вы устанавливаете значение, которое будет выбрано в ComboBox?
Where do you set the value to be selected in the ComboBox -> прочтите вопрос. Но какое это вообще имеет значение? Четко указано, чего я хочу достичь (1 POCO и список других POCO как ItemSource)





Вы не можете выбрать элемент поля со списком с помощью элемента, которого нет в поле со списком.
Верно:
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" };
}
Я уже понял этот вопрос. Прямо сейчас ищу способ сделать это автоматически
затем вам нужно выбрать руководителя проекта «из» списка, назначенного источнику элементов.
Что такое
ProjectLeader? ЧтобыSelectedItemработал здесь, это должно быть имя свойства вашего объекта DataContext, значением которого должен быть объект типаEmployee, который должно быть содержится в коллекции объектов, возвращаемыхservice.GetAllEmployee(). Не просто «имеет тот же идентификатор», но и фактический экземпляр должен быть там. То, как вы заполняете список, кажется маловероятным.