在WPF DataGrid中绑定ComboBoxColumn的ItemsSource我有两个简单的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>但是这给了我调试器输出中的另一个错误:System.Windows.Data错误:4:无法找到绑定源,引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Window',AncestorLevel ='1''。BindingExpression:路径= CompanyItems; 的DataItem = NULL; target元素是'DataGridComboBoxColumn'(HashCode = 1150788); target属性是'ItemsSource'(输入'IEnumerable')问题:如何将DataGridComboBoxColumn的ItemsSource绑定到ViewModel的CompanyItems集合?有可能吗?提前感谢您的帮助!
3 回答
函数式编程
TA贡献1807条经验 获得超9个赞
请检查下面的DataGridComboBoxColumn xaml是否适合您:
<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的组合框
慕村225694
TA贡献1880条经验 获得超4个赞
在关于对MSDN文档ItemsSource
的DataGridComboBoxColumn
说,只有静态的资源,组合框项目静态代码或内联的集合可以绑定到ItemsSource
:
要填充下拉列表,请首先使用以下选项之一设置ComboBox的ItemsSource属性:
静态资源。有关更多信息,请参阅StaticResource标记扩展。
一个x:静态代码实体。有关更多信息,请参见x:静态标记扩展。
ComboBoxItem类型的内联集合。
如果我理解正确,则无法绑定到DataContext的属性。
确实:当我在ViewModel中创建CompanyItems
一个静态属性时......
public static ObservableCollection<CompanyItem> CompanyItems { get; set; }
...将ViewModel所在的命名空间添加到窗口中...
xmlns:vm="clr-namespace:DataGridComboBoxColumnApp"
...并将绑定更改为...
<DataGridComboBoxColumn ItemsSource="{Binding Source={x:Static vm:ViewModel.CompanyItems}}" DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValueBinding="{Binding CompanyID}" />
...然后它的工作原理。但将ItemsSource作为静态属性可能有时可以,但并不总是我想要的。
- 3 回答
- 0 关注
- 4691 浏览
添加回答
举报
0/150
提交
取消