WPF - DataGridComboboxColumn中的绑定错误

时间:2015-05-08 12:24:43

标签: wpf datagridcomboboxcolumn

我需要在我的dataGrid中使用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

请帮助。

2 个答案:

答案 0 :(得分: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; }
    }  
}

答案 1 :(得分:0)

你试过了吗?

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

如果绑定的上下文是SomeData,则应将其指向正确的属性)

来自MSDN

  

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

     
      
  • 静态资源。有关更多信息,请参阅StaticResource Markup   扩展

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

  •   
  • ComboBoxItem类型的内联集合。

  •   
     

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

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