根据 ObservableCollection<T> 项目的 WPF select 组合框项目

WPF select combox item according to ObservableCollection<T> item

我不知道怎么问这个问题,但我会尽力的。 我有绑定到 GridView 的 ObservableCollection,并且 GridView 有一个带有组合框的列,我需要在用来自 ObservableCollection 的数据填充 gridview 时自动 select 来自组合框的项目。

XAML

<DataGrid x:Name="dg" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Date"></DataGridTextColumn>
                    <DataGridTextColumn Header="Description"></DataGridTextColumn>
                    <DataGridTemplateColumn Header="Status" Width="100">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox Name="cb" SelectedItem="{Binding Path=Status}" SelectionChanged="cb_SelectionChanged" ItemsSource="{Binding Source={local:EnumBindingSourceExtention {x:Type local:status}}}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

MainWindow.xaml.cs

    public partial class MainWindow : Window
    {
        public ObservableCollection<Record> TasksList = new ObservableCollection<Record>();
        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=>TasksList.Add(a));
                    dg.ItemsSource = TasksList;
                }
            }
        }
    }
    [XmlRoot("Records")]
    public class Records
    {
        [XmlElement("Record", typeof(Record))]
        public List<Record> 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
    }

所以,我需要在 window 中加载,同时将 TasksList 绑定到数据网格 dg 以获取 Status 字符串和 select 项目来自组合框。

有什么帮助吗?

Record class 的 Status 属性 的类型更改为 status (枚举类型)或设置 ItemsSource 属性 的 ComboBoxIEnumerable<string>:

public override object ProvideValue(IServiceProvider serviceProvider)
{
    return Enum.GetValues(EnumType).Cast<object>().Select(x => x.ToString());
}

类型必须匹配。您不能将 string 属性 设置为枚举 (enum) 值。