DataGrid中的WPF绑定到DataContext

Posted

技术标签:

【中文标题】DataGrid中的WPF绑定到DataContext【英文标题】:WPF Binding in DataGrid to DataContext 【发布时间】:2013-11-16 20:52:21 【问题描述】:

我在将数据网格组合框ItemsSource 映射到主数据上下文时遇到了一些问题。 这是一些演示代码来显示问题。

我的物品类

public class MyData

    public string Name  get; set; 
    public string Priority  get; set; 

我创建了一个类来连接数据上下文,它看起来像这样

public class myMV

    public ObservableCollection<MyData> MyItems  get; set; 

    public List<string> PriorityTypes
    
        get  return new List<string>  "High", "Normal", "Low" ; 
    

    public myMV()
    
        this.MyItems = new ObservableCollection<MyData>
                       
                           new MyData  Name = "item1", Priority = "Low" ,
                           new MyData  Name = "item2", Priority = "Normal" ,
                           new MyData  Name = "item2", Priority = "High" 
                       ;
    

然后我在 MainWindows() 中创建并将其分配给数据上下文

public MainWindow()

    InitializeComponent();
    this.DataContext = new myMV();

在 xaml 方面,我创建了一个简单的数据网格来尝试像这样显示。

<DataGrid Grid.Row="1" ItemsSource="Binding MyItems" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Title" Binding="Binding Name" Width="*"></DataGridTextColumn>
        <DataGridComboBoxColumn Header="Priority" SelectedItemBinding="Binding Priority" ItemsSource="Binding PriorityTypes, RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type Window"/>
    </DataGrid.Columns>
</DataGrid>

它没有将 Combobox ItemsSource 映射到 DataContext.PriorityTypes

我还尝试(使用相同的相对源)执行 DataContext.PriorityTypes,但没有成功。 我遇到了一些没有运气的博客文章,但这一篇展示了我采用的方法。 http://sekagra.com/wp/2013/04/dynamic-itemssource-for-combobox-in-a-datagrid/

这是我的问题的一个过度简化的例子,但关键部分是 PriorityType 必须是一个列表,所以我不能做枚举。

有人知道如何修复这个绑定吗?

【问题讨论】:

你试过ItemsSource="Binding PriorityTypes吗? 是的,因为数据网格的 itemssource 设置为 datacontext 的属性(组合框 itemsource)本身并不知道要查找更高的级别。 【参考方案1】:

我相信您遇到的问题与 DataGridComboBoxColumn 进行数据绑定时有关 - 根据跟踪消息,您根本无法到达父级。将该列替换为使用 DataTemplate 的列:

     <DataGridTemplateColumn Header="Priority"  Width="100">
        <DataGridTemplateColumn.CellTemplate>
           <DataTemplate>
              <ComboBox SelectedItem="Binding Priority" ItemsSource="Binding DataContext.PriorityTypes, RelativeSource=RelativeSource FindAncestor, AncestorType=Window" />
           </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
     </DataGridTemplateColumn>

您甚至可以花哨并使用单独的模板进行展示...

     <DataGridTemplateColumn Header="Priority"  Width="100">
        <DataGridTemplateColumn.CellTemplate>
           <DataTemplate>
              <Label Content="Binding Priority" />
           </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        <DataGridTemplateColumn.CellEditingTemplate>
           <DataTemplate>
              <ComboBox SelectedItem="Binding Priority" ItemsSource="Binding DataContext.PriorityTypes, RelativeSource=RelativeSource FindAncestor, AncestorType=Window" />
           </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
     </DataGridTemplateColumn>

【讨论】:

以上是关于DataGrid中的WPF绑定到DataContext的主要内容,如果未能解决你的问题,请参考以下文章

将按钮绑定到 DataGrid WPF 中的对象

如何防止 ComboBox 中的 NewItemPlaceholder 行绑定到与 WPF 中的 DataGrid 相同的 DataTable

WPF DataGrid 中的 IsSelected 绑定

WPF 绑定到资源中的元素

WPF DataGrid MultiBinding到DataGrid ItemSsource中的类

WPF DataGrid 绑定到 XML 未更新