我有两个简单的模型类和视图模型的的ItemsSource ...绑定在WPF数据网格中的ComboBoxColumn
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>
视图模型设置为在主窗口的DataContext
在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的集合到ViewModel的GridItems
集合中。这部分工作,显示名为“Jim”的单个网格线。
我还希望将每行ComboBox的ItemsSource
设置为ViewModel的CompanyItems
集合。这部分不工作:组合框保留为空,并在调试器输出窗口,我看到一条错误消息:
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
一个属性,它不是这样的,这是该绑定失败的原因。
我已经尝试过了RelativeSource
和AncestorType
像这样的工作:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
但是,这给了我另一个错误的调试器输出:
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集合?它有可能吗?
感谢您提前帮忙!
地狱,这个作品!如果我只能理解为什么?并且为什么不改变Rachel推荐的更改的原始代码?无论如何,非常感谢! – Slauma 2011-03-23 19:43:17
我相信你可以在这里找到解释:http://wpf.codeplex.com/workitem/8153?ProjectName=wpf(见评论) – 2011-03-23 19:53:01
他们似乎决定把这个bug(“我们已经在我们提交了一个bug内部数据库将在未来版本中修复“)。在这个线程中看看我自己的答案:问题已经通过文档解决,强烈表明这一点永远不会改变。 – Slauma 2011-03-23 20:27:34