WPF MVVM DataGrid ComboboxColumn 绑定到我的模型中的列表

WPF MVVM DataGrid ComboboxColumn binding to List in my Model

我目前正在使用 MVVM 开发一个 WPF 项目。

我有一个 DataGrid 绑定到 ObservableCollection 个模型,如下所示:

 class Model : INotifyPropertyChanged
{

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

    private List<string> m_Names;
    public List<string> Names
    {
        get
        {
            return m_Names;
        }
        set
        {
            m_Names = value;
            OnPropertyChanged("Names");
        }
    }

    private double? m_Value;
    public double? Value
    {
        get
        {
            return m_Value;
        }
        set
        {
            m_Value = value;
            OnPropertyChanged("Value");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

现在我想使用 DataGridComboBoxColumn 来创建一个组合框,其中 属性 "Name" 作为 SelectedItem,Names 作为 ItemSource。

我的每个模型都有自己的一组名称,这些名称与任何其他模型的名称都不相同。

我用谷歌搜索并浏览了 Whosebug,但没有找到任何解决方案。我也尝试过像我知道 DevExpress 网格控件可以做的那样应用过滤器,但我没有找到基本 WPF DataGrids 的任何东西。

如何将我的 DataGridComboBoxColumn 绑定到模型中的 属性 List

如果您使用 DataGridComboBoxColumn,则必须为 ItemsSource 提供静态资源,这在 "Remarks" 部分中有说明 https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagridcomboboxcolumn?view=netframework-4.8

因为每个视图模型都有不同的 "Names",所以您可以使用 DataGridTemplateColumn 而不是 DataGridComboBoxColumn

            <DataGridTemplateColumn Header="Name">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Names}">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding}"/>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>                    

你尝试了什么?如果 DataGridItemsSource 属性 设置或绑定到 IEnumerable<Model>,这应该有效:

<DataGridComboBoxColumn ItemsSource="{Binding Names}" SelectedItemBinding="{Binding Name}" />

有关更多建议,请参阅 this TechNet 文章。