我有两个简单的 Model 类和一个 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; }
}
... 和一个简单的窗口:
<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
:
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”的单个 Grid 行。
我还希望将 ComboBox 中每一行的 ItemsSource
设置为 ViewModel 的 CompanyItems
集合。这部分不工作: 组合框仍然是空的,在调试器输出窗口中我看到一个错误消息:
系统。视窗。数据错误: 2: 不能 查找控制 FrameworkElement 或 目标的 FrameworkContentElement 元素。 BindingExpression: Path = CompanyItems; Dataltem = null; 目标元素为 “ DataGridComboBoxColumn” (HashCode = 28633162) ; 目标属性 是‘ ItemsSource’(键入‘ IEnumable’)
我相信 WPF 期望 CompanyItems
是 GridItem
的属性,但事实并非如此,这就是绑定失败的原因。
我已经尝试过使用 RelativeSource
和 AncestorType
,就像这样:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
但是这给了我调试器输出中的另一个错误:
系统。视窗。数据错误: 4: 不能 查找引用绑定的来源 相对来源寻找祖先, 系统。窗口。窗口, 祖先级 =’1”。 BindingExpression: Path = CompanyItems; Dataltem = null; 目标元素为 “ DataGridComboBoxColumn” (HashCode = 1150788) ; 目标属性为 ‘ ItemsSource’(键入‘ IEnumable’)
问: 如何将 DataGridComboBoxColumn 的 ItemsSource 绑定到 ViewModel 的 CompanyItems 集合?有可能吗?
提前谢谢你的帮助!