在 WPF DataGrid 中绑定 ComboBoxColumn 的 ItemsSource [英] Binding ItemsSource of a ComboBoxColumn in WPF DataGrid
问题描述
我有两个简单的 Model 类和一个 ViewModel...
I have two simple Model classes and a ViewModel...
public class GridItem
{
public string Name { get; set; }
public int CompanyID { get; set; }
}
public class CompanyItem
{
public int ID { get; set; }
public string Name { get; set; }
}
public class ViewModel
{
public ViewModel()
{
GridItems = new ObservableCollection<GridItem>() {
new GridItem() { Name = "Jim", CompanyID = 1 } };
CompanyItems = new ObservableCollection<CompanyItem>() {
new CompanyItem() { ID = 1, Name = "Company 1" },
new CompanyItem() { ID = 2, Name = "Company 2" } };
}
public ObservableCollection<GridItem> GridItems { get; set; }
public ObservableCollection<CompanyItem> CompanyItems { get; set; }
}
...和一个简单的窗口:
...and a simple Window:
<Window x:Class="DataGridComboBoxColumnApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding GridItems}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
ViewModel 设置为 App.xaml.cs 中 MainWindow 的 DataContext
:
The ViewModel is set to the MainWindow's DataContext
in App.xaml.cs:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow window = new MainWindow();
ViewModel viewModel = new ViewModel();
window.DataContext = viewModel;
window.Show();
}
}
如您所见,我将 DataGrid 的 ItemsSource
设置为 ViewModel 的 GridItems
集合.这部分工作,显示名称为Jim"的单个网格线.
As you can see I set the ItemsSource
of the DataGrid to the GridItems
collection of the ViewModel. This part works, the single Grid line with Name "Jim" is displayed.
我还想将每行 ComboBox 的 ItemsSource
设置为 ViewModel 的 CompanyItems
集合.这部分不起作用:组合框保持为空,在调试器输出窗口中我看到一条错误消息:
I also want to set the ItemsSource
of the ComboBox in every row to the CompanyItems
collection of the ViewModel. This part does not work: The ComboBox remains empty and in the Debugger Output Window I see an error message:
System.Windows.Data 错误:2:不能找到管理 FrameworkElement 或目标的 FrameworkContentElement元素.BindingExpression:Path=CompanyItems;数据项=空;目标元素是'DataGridComboBoxColumn'(哈希码=28633162);目标财产是ItemsSource"(类型IEnumerable")
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=CompanyItems; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=28633162); target property is 'ItemsSource' (type 'IEnumerable')
我相信 WPF 希望 CompanyItems
成为 GridItem
的属性,但事实并非如此,这就是绑定失败的原因.
I believe that WPF expects CompanyItems
to be a property of GridItem
which is not the case, and that's the reason why the binding fails.
我已经尝试使用 RelativeSource
和 AncestorType
像这样:
I've already tried to work with a RelativeSource
and AncestorType
like so:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
但这在调试器输出中给了我另一个错误:
But that gives me another error in the debugger output:
System.Windows.Data 错误:4:不能查找绑定参考源'RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel='1''.BindingExpression:Path=CompanyItems;数据项=空;目标元素是'DataGridComboBoxColumn'(哈希码=1150788);目标属性是'ItemsSource'(类型 'IEnumerable')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=CompanyItems; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=1150788); target property is 'ItemsSource' (type 'IEnumerable')
问题:如何将 DataGridComboBoxColumn 的 ItemsSource 绑定到 ViewModel 的 CompanyItems 集合?有可能吗?
提前感谢您的帮助!
推荐答案
请检查以下 DataGridComboBoxColumn xaml 是否适合您:
Pls, check if DataGridComboBoxColumn xaml below would work for you:
<DataGridComboBoxColumn
SelectedValueBinding="{Binding CompanyID}"
DisplayMemberPath="Name"
SelectedValuePath="ID">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.CompanyItems, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.CompanyItems, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
您可以在这里找到解决您所面临问题的另一种解决方案:在 WPF DataGrid 中使用组合框
Here you can find another solution for the problem you're facing: Using combo boxes with the WPF DataGrid
这篇关于在 WPF DataGrid 中绑定 ComboBoxColumn 的 ItemsSource的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!