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

时间:2019-06-02 14:45:56

标签: c# wpf datagrid datagridcomboboxcolumn

我目前正在使用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创建一个组合框,其属性“名称”作为SelectedItem,名称作为ItemSource。

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

我已经迷糊了,并检查了StackOverflow,但没有找到任何解决方案。我也曾尝试过过滤器,就像我知道DevExpress Grid Controls可以做的那样,但是我没有为基本的WPF DataGrid找到任何东西。

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

2 个答案:

答案 0 :(得分:1)

如果使用DataGridComboBoxColumn,则必须为ItemsSource提供静态资源,这在“备注”部分中进行了说明。 https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagridcomboboxcolumn?view=netframework-4.8

由于每种视图模型都有不同的“名称”,因此可以使用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>                    

答案 1 :(得分:0)

您尝试了什么?假设DataGrid的{​​{1}}属性已设置或绑定到ItemsSource,则该方法应该起作用:

IEnumerable<Model>

请参阅this TechNet文章以获取更多建议。