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>
你尝试了什么?如果 DataGrid
的 ItemsSource
属性 设置或绑定到 IEnumerable<Model>
,这应该有效:
<DataGridComboBoxColumn ItemsSource="{Binding Names}" SelectedItemBinding="{Binding Name}" />
有关更多建议,请参阅 this TechNet 文章。
我目前正在使用 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>
你尝试了什么?如果 DataGrid
的 ItemsSource
属性 设置或绑定到 IEnumerable<Model>
,这应该有效:
<DataGridComboBoxColumn ItemsSource="{Binding Names}" SelectedItemBinding="{Binding Name}" />
有关更多建议,请参阅 this TechNet 文章。