我有两个简单的模型类和一个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>
在App.xaml.cs中将ViewModel设置为主窗口的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“的单一网格线。
我还希望将每一行中ComboBox的ItemsSource
设置为ViewModel的CompanyItems
集合。此部分不起作用: ComboBox保持为空,并且在调试器输出窗口中我看到一条错误消息:
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。BindingExpression:Path=CompanyItems;DataItem=null;目标元素为'DataGridComboBoxColumn‘(HashCode=28633162);目标属性为'ItemsSource’(类型为'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错误:4:无法找到具有引用'RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel=‘1’的绑定源。BindingExpression:Path=CompanyItems;DataItem=null;目标元素为'DataGridComboBoxColumn‘(HashCode=1150788);目标属性为'ItemsSource’(类型为'IEnumerable')
问题:如何将DataGridComboBoxColumn的ItemsSource绑定到ViewModel的CompanyItems集合?这有可能吗?
提前感谢您的帮助!
发布于 2013-09-23 19:16:20
RookieRick是对的,使用DataGridTemplateColumn
而不是DataGridComboBoxColumn
提供了一个简单得多的XAML。
此外,通过直接从GridItem
访问CompanyItem
列表,您可以摆脱RelativeSource
。
IMHO,这给了你一个非常干净的解决方案。
XAML:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding GridItems}" >
<DataGrid.Resources>
<DataTemplate x:Key="CompanyDisplayTemplate" DataType="vm:GridItem">
<TextBlock Text="{Binding Company}" />
</DataTemplate>
<DataTemplate x:Key="CompanyEditingTemplate" DataType="vm:GridItem">
<ComboBox SelectedItem="{Binding Company}" ItemsSource="{Binding CompanyList}" />
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridTemplateColumn CellTemplate="{StaticResource CompanyDisplayTemplate}"
CellEditingTemplate="{StaticResource CompanyEditingTemplate}" />
</DataGrid.Columns>
</DataGrid>
视图模型:
public class GridItem
{
public string Name { get; set; }
public CompanyItem Company { get; set; }
public IEnumerable<CompanyItem> CompanyList { get; set; }
}
public class CompanyItem
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString() { return Name; }
}
public class ViewModel
{
readonly ObservableCollection<CompanyItem> companies;
public ViewModel()
{
companies = new ObservableCollection<CompanyItem>{
new CompanyItem { ID = 1, Name = "Company 1" },
new CompanyItem { ID = 2, Name = "Company 2" }
};
GridItems = new ObservableCollection<GridItem> {
new GridItem { Name = "Jim", Company = companies[0], CompanyList = companies}
};
}
public ObservableCollection<GridItem> GridItems { get; set; }
}
https://stackoverflow.com/questions/5409259
复制相似问题