#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
свойству значение перечисления (перечисления).