无法将DataGridComboBoxColumn绑定到视图模型集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将DataGridComboBoxColumn绑定到视图模型集合相关的知识,希望对你有一定的参考价值。

我有一个包含项目集合的视图模型,每个项目都有一组键。我想让DataGridComboBoxColumn显示每个项目的键的下拉列表。我见过类似的问题,但没有一个答案对我有帮助。当我运行我的应用程序时,所有组合框都是空的。这是我的xaml:

<Window
    x:Class="TestDataGridCombobox.MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}"/>
            <DataGridComboBoxColumn ItemsSource="{Binding Path=Keys}" SelectedValueBinding="{Binding Path=SelectedKey}"/>
        </DataGrid.Columns>
    </DataGrid>
</Window>

这是我的视图模型:

using System.Collections.ObjectModel;
using System.ComponentModel;

namespace TestDataGridCombobox
{
    public class MyViewModel : INotifyPropertyChanged
    {
        public MyViewModel()
        {
            Items.Add(new MyItem { Name = "Item1" });
            Items.Add(new MyItem { Name = "Item2" });
            Items.Add(new MyItem { Name = "Item3" });
        }

        private ObservableCollection<MyItem> items = new ObservableCollection<MyItem>();        
        public ObservableCollection<MyItem> Items
        {
            get { return items; }
            set
            {
                if (items == value)
                    return;
                items = value;
                OnPropertyChanged("Items");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string property)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
        }
    }

    public class MyItem : INotifyPropertyChanged
    {
        public MyItem()
        {
            Keys.Add("Key1");
            Keys.Add("Key2");
            Keys.Add("Key3");
            SelectedKey = "Key1";
        }

        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                if (name == value)
                    return;
                name = value;
                OnPropertyChanged("Name");
            }
        }

        private string selectedKey;
        public string SelectedKey
        {
            get { return selectedKey; }
            set
            {
                if (selectedKey == value)
                    return;
                selectedKey = value;
                OnPropertyChanged("SelectedKey");
            }
        }

        private ObservableCollection<string> keys = new ObservableCollection<string>();
        public ObservableCollection<string> Keys
        {
            get { return keys; }
            set
            {
                if (keys == value)
                    return;
                keys = value;
                OnPropertyChanged("Keys");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string property)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
        }
    }
}

并且视图模型绑定到窗口,如下所示:

public partial class MyWindow : Window
{
    public MyWindow()
    {
        InitializeComponent();
        DataContext = new MyViewModel();
    }
}

我可以使用模板化列,但我很感兴趣为什么这个特定的例子不起作用,代码有什么问题吗?或者DataGridComboBoxColumn有任何限制吗?

答案

或者DataGridComboBoxColumn有任何限制吗?

是的,有一些限制。您可以通过阅读DataGridComboBoxColumn Class documentation中的备注部分找到它们:

要填充下拉列表,请首先使用以下选项之一设置ComboBox的ItemsSource属性:

有很多解决这个问题的解决方法,例如 - 正如你所写 - 你可以使用DataGridTemplateColumn

我希望它可以帮到你。

以上是关于无法将DataGridComboBoxColumn绑定到视图模型集合的主要内容,如果未能解决你的问题,请参考以下文章

DataGridComboBoxColumn绑定到DataGrid DataContext

使用 MVVM 绑定 WPF DataGridComboBoxColumn

DataGridComboBoxColumn 数据绑定

仅在编辑模式下显示静态列表的 WPF DataGridComboboxColumn

如何创建简单的 DataGridComboboxColumn?

从代码绑定 DataGridComboBoxColumn