【问题标题】:WPF - Binding error in DataGridComboboxColumnWPF - DataGridComboboxColumn 中的绑定错误
【发布时间】:2015-05-08 21:53:45
【问题描述】:

我需要在我的数据网格中使用DataGridComboboxColumn。 但是我要绑定到我的数据网格的可观察集合不是静态的?

由于数据网格包含DataGridComboboxColumn,因此该 Observale 集合是否必须是静态的。

我要绑定到DataGridCombobox 列的是另一个集合,该集合包含在我上面提到的可观察集合中的对象所在的类中。这是我第一次使用 DataGridCombobox 列。任何解释将不胜感激。

<DataGrid ItemSource="{Binding SomeData}">
    <DataGrid.Columns>
        <DataGridTemplateColumn DisplayMemberPath="FirstName" />
        <DataGridTemplateColumn DisplayMemberPath="LastName"  />
        <DataGridComboboxColumn ItemSource={Binding SomeOtherListContainedInSomeDataAbove}" />
    </DataGrid.Columns>
<DataGrid>

但这会产生绑定错误,并显示 SomeOtherListContainedInSomeDataAbove 无法找到。

请帮忙。

【问题讨论】:

  • 你可能需要设置一个DataContext
  • SomeOtherListContainedInSomeDataAbove 位于何处?是在 ViewModel 中吗?
  • 是的,您似乎需要提供更多信息。 DataContext 是什么,住在哪里等等......

标签: wpf datagridcomboboxcolumn


【解决方案1】:

DataGridComboboxColumn 不参与逻辑树,因此很难直接绑定其ItemsSource。但是DataGridCell 是逻辑树的一部分。您可以创建元素样式并尝试绑定您的收藏。在下面的示例中,我给出了两种使用DataGridComboBoxColumnDatagridTemplateColumn 的方法。我假设您正在使用 MVVM。

<DataGrid ItemsSource="{Binding DataGrdList}" AutoGenerateColumns="False">            
        <DataGrid.Columns>
            <DataGridComboBoxColumn SelectedItemBinding="{Binding DataTypeName}"  Header="Combo">
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.DataTypeList}"/>
                        <Setter Property="IsReadOnly" Value="True"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.DataTypeList}"/>
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
            <DataGridTemplateColumn Header="Template">
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox SelectedValue="{Binding Path=DataTypeName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                  ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.DataTypeList}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=DataTypeName, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>

    </DataGrid>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainViewModel();
    }
}

public class MainViewModel
{
    private ObservableCollection<string> myVar = new ObservableCollection<string>();

    public ObservableCollection<string> DataTypeList
    {
        get { return myVar; }
        set { myVar = value; }
    }

    private ObservableCollection<DataType1> myVar1 = new ObservableCollection<DataType1>();

    public ObservableCollection<DataType1> DataGrdList
    {
        get { return myVar1; }
        set { myVar1 = value; }
    }

    public MainViewModel()
    {
        myVar.Add("Int");
        myVar.Add("Bool");
        myVar.Add("String");  
    }   
}

public class DataType1
{
    private string name;

    public string DataTypeName
    {
        get { return name; }
        set { name = value; }
    }  
}

【讨论】:

  • 谢谢,这对我来说是正确的答案,也是很好的例子!
  • 我在这里还找到了另一种方法:stackoverflow.com/a/37812160/6296708 这个答案使用这篇文章 [[WPF] HOW TO BIND TO DATA WHEN THE DATACONTEXT IS NOT INHERITED](thomaslevesque.com/2011/03/21/…) 以防万一不喜欢使用TemplateStyle。 (使用Freezable 类)
【解决方案2】:

你试过了吗:

<DataGridComboboxColumn ItemSource={Binding path=SomeOtherListContainedInSomeDataAbove}"> 

如果您的绑定上下文是SomeData,这应该指向正确的属性)

来自MSDN

要填充下拉列表,首先将 ItemsSource 属性设置为 使用以下选项之一的 ComboBox:

  • 静态资源。有关详细信息,请参阅静态资源标记 扩展。

  • 一个 x:静态代码实体。有关详细信息,请参阅 x:静态标记扩展。

  • ComboBoxItem 类型的内联集合。

设置 ItemsSource 后,将 ComboBox 中的选定项绑定到单元格所在行的数据项。您可以使用以下属性之一设置绑定....

所以,如果它不是静态的,我会说尝试选项 3 :)

【讨论】:

  • 当我这样做时出现以下错误。找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=SomeOtherListContainedInSomeDataAbove DataItem=null;目标元素是“DataGridComboBoxColumn”(HashCode=51802613);目标属性是“ItemsSource”(类型“IEnumerable”)
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2011-07-27
  • 2017-08-05
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多