为了账号安全,请及时绑定邮箱和手机立即绑定

在WPF DataGrid中绑定ComboBoxColumn的ItemsSource

在WPF DataGrid中绑定ComboBoxColumn的ItemsSource

吃鸡游戏 2019-07-26 17:07:29
在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的组合框


查看完整回答
反对 回复 2019-07-26
?
慕村225694

TA贡献1880条经验 获得超4个赞

关于对MSDN文档ItemsSourceDataGridComboBoxColumn说,只有静态的资源,组合框项目静态代码或内联的集合可以绑定到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作为静态属性可能有时可以,但并不总是我想要的。


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 4478 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信