在WPF DataGrid中绑定ComboBoxColumn的ItemsSource

在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集合?有可能吗?

提前感谢您的帮助!


吃鸡游戏
浏览 4518回答 3
3回答

函数式编程

请检查下面的DataGridComboBoxColumn xaml是否适合您:<DataGridComboBoxColumn&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;SelectedValueBinding="{Binding&nbsp;CompanyID}"&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;DisplayMemberPath="Name"&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;SelectedValuePath="ID"> &nbsp;&nbsp;&nbsp;&nbsp;<DataGridComboBoxColumn.ElementStyle> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Style&nbsp;TargetType="{x:Type&nbsp;ComboBox}"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Setter&nbsp;Property="ItemsSource"&nbsp;Value="{Binding&nbsp;Path=DataContext.CompanyItems,&nbsp;RelativeSource={RelativeSource&nbsp;AncestorType={x:Type&nbsp;Window}}}"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</Style> &nbsp;&nbsp;&nbsp;&nbsp;</DataGridComboBoxColumn.ElementStyle> &nbsp;&nbsp;&nbsp;&nbsp;<DataGridComboBoxColumn.EditingElementStyle> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Style&nbsp;TargetType="{x:Type&nbsp;ComboBox}"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Setter&nbsp;Property="ItemsSource"&nbsp;Value="{Binding&nbsp;Path=DataContext.CompanyItems,&nbsp;RelativeSource={RelativeSource&nbsp;AncestorType={x:Type&nbsp;Window}}}"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</Style> &nbsp;&nbsp;&nbsp;&nbsp;</DataGridComboBoxColumn.EditingElementStyle></DataGridComboBoxColumn>在这里,您可以找到针对您遇到的问题的另一种解决方案:使用带有WPF DataGrid的组合框

慕村225694

在关于对MSDN文档ItemsSource的DataGridComboBoxColumn说,只有静态的资源,组合框项目静态代码或内联的集合可以绑定到ItemsSource:要填充下拉列表,请首先使用以下选项之一设置ComboBox的ItemsSource属性:静态资源。有关更多信息,请参阅StaticResource标记扩展。一个x:静态代码实体。有关更多信息,请参见x:静态标记扩展。ComboBoxItem类型的内联集合。如果我理解正确,则无法绑定到DataContext的属性。确实:当我在ViewModel中创建CompanyItems一个静态属性时......public&nbsp;static&nbsp;ObservableCollection<CompanyItem>&nbsp;CompanyItems&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}...将ViewModel所在的命名空间添加到窗口中...xmlns:vm="clr-namespace:DataGridComboBoxColumnApp"...并将绑定更改为...<DataGridComboBoxColumn &nbsp;&nbsp;&nbsp;&nbsp;ItemsSource="{Binding&nbsp;Source={x:Static&nbsp;vm:ViewModel.CompanyItems}}"&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;DisplayMemberPath="Name" &nbsp;&nbsp;&nbsp;&nbsp;SelectedValuePath="ID" &nbsp;&nbsp;&nbsp;&nbsp;SelectedValueBinding="{Binding&nbsp;CompanyID}"&nbsp;/>...然后它的工作原理。但将ItemsSource作为静态属性可能有时可以,但并不总是我想要的。
打开App,查看更多内容
随时随地看视频慕课网APP