我有一个包含项目集合的视图模型,每个项目都有一组键。我想让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有任何限制吗?
答案 0 :(得分:1)
或
DataGridComboBoxColumn
是否有任何限制?
是的,有一些限制。您可以通过阅读DataGridComboBoxColumn Class documentation:
中的备注部分找到它们要填充下拉列表,请首先使用以下选项之一设置ComboBox的ItemsSource属性:
- 静态资源。有关更多信息,请参阅StaticResource Markup Extension。
- 一个x:静态代码实体。有关更多信息,请参阅x:Static Markup Extension。
- ComboBoxItem类型的内嵌集合。
要解决此问题有很多解决方法,例如 - 正如您所写 - 您可以使用DataGridTemplateColumn。
我希望它可以帮到你。