WPF выбирает элемент combox в соответствии с элементом ObservableCollection

#c# #wpf #binding

Вопрос:

Я не знаю, как задать этот вопрос, но я постараюсь сделать все возможное. У меня есть коллекция ObservableCollection, которая привязана к GridView, и в этой таблице есть столбец с выпадающим списком, и мне нужно при заполнении представления сетки данными из коллекции ObservableCollection автоматически выбрать элемент из выпадающего списка.

XAML

 lt;DataGrid x:Name="dg" AutoGenerateColumns="False"gt;  lt;DataGrid.Columnsgt;  lt;DataGridTextColumn Header="Date"gt;lt;/DataGridTextColumngt;  lt;DataGridTextColumn Header="Description"gt;lt;/DataGridTextColumngt;  lt;DataGridTemplateColumn Header="Status" Width="100"gt;  lt;DataGridTemplateColumn.CellTemplategt;  lt;DataTemplategt;  lt;ComboBox Name="cb" SelectedItem="{Binding Path=Status}" SelectionChanged="cb_SelectionChanged" ItemsSource="{Binding Source={local:EnumBindingSourceExtention {x:Type local:status}}}"/gt;  lt;/DataTemplategt;  lt;/DataGridTemplateColumn.CellTemplategt;  lt;/DataGridTemplateColumngt;  lt;/DataGrid.Columnsgt;  lt;/DataGridgt;  

Главное окно.xaml.cs

 public partial class MainWindow : Window  {  public ObservableCollectionlt;Recordgt; TasksList = new ObservableCollectionlt;Recordgt;();  public string DbDoc;  public MainWindow()  {  InitializeComponent();  this.DataContext = this;  }   private void AddRecord(Record task)  {  TasksList.Add(task);  }   private void Window_Loaded(object sender, RoutedEventArgs e)  {  DbDoc = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "records.xml");  if (File.Exists(DbDoc))  {  using (StreamReader reader = new StreamReader(DbDoc))  {  XmlSerializer serializer = new XmlSerializer(typeof(Records));  Records records = (Records)serializer.Deserialize(reader);  records.RecordsList.ForEach(a=gt;TasksList.Add(a));  dg.ItemsSource = TasksList;  }  }  }  }  [XmlRoot("Records")]  public class Records  {  [XmlElement("Record", typeof(Record))]  public Listlt;Recordgt; RecordsList { get; set; }  }  public class Record  {  [XmlElement("Date")]  public string Date { get; set; }  [XmlElement("Description")]  public string Description { get; set; }  [XmlElement("Status")]  public string Status { get; set; }   }  public class EnumBindingSourceExtention : MarkupExtension  {  public Type EnumType { get; private set; }   public EnumBindingSourceExtention(Type enumType)  {  if (enumType == null || !enumType.IsEnum)  {  throw new Exception("EnumType is null or not EnumType");  }  this.EnumType = enumType;  }   public override object ProvideValue(IServiceProvider serviceProvider)  {  return Enum.GetValues(EnumType);  }  }  public enum status  {  New,  Old  }  

итак, мне нужно при загрузке окна при привязке TasksList к сетке dg данных также получить Status строку и выбрать элемент из выпадающего списка.

Какая-нибудь помощь?

Ответ №1:

Измените тип Status свойства Record класса на status (тип перечисления) или установите ItemsSource свойство ComboBox на IEnumerablelt;stringgt; :

 public override object ProvideValue(IServiceProvider serviceProvider) {  return Enum.GetValues(EnumType).Castlt;objectgt;().Select(x =gt; x.ToString()); }  

Типы должны совпадать. Вы не можете задать string свойству значение перечисления (перечисления).