将Combobox控件绑定到DataGrid中的单独源

时间:2011-01-18 17:01:42

标签: c# wpf binding

我试图在DataGrid中使用ComboBox,这将允许用户选择来自不同表的值。我使用ViewModel类作为DataContext,它包含一个ObservableCollection用于Terminals,另一个用于TerminalTypes。

网格上的绑定很好,所有行都已填充,DataGridTextColumns都显示正确的数据,但我的ComboBox是空的。

我知道尝试绑定的ObservableCollection已经填充了,如果我将ComboBox移到DataGrid之外,它会按预期工作。

<my:DataGrid Name="MenuDetailGrid" AutoGenerateColumns="False" ItemsSource="{Binding Terminals}">
    <my:DataGrid.Columns>
        <my:DataGridTextColumn Header="Terminal Type ID" Binding="{Binding TERMINAL_TYPE_ID}" IsReadOnly="True" />
        <my:DataGridTemplateColumn Header="Terminal Type">
            <my:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox DisplayMemberPath="TTYPE_NAME" SelectedValuePath="TERMINAL_TYPE"
                              SelectedValue="{Binding TERMINAL_TYPE_ID}" 
                              ItemsSource="{Binding TerminalTypes}" />

                </DataTemplate>
            </my:DataGridTemplateColumn.CellTemplate>
        </my:DataGridTemplateColumn>

显然,当部分DataGrid时,ComboBox上的绑定行为是不同的,但我有点难过为什么?

有人可以帮我理解我做错了吗?

3 个答案:

答案 0 :(得分:4)

绑定行为是相同的。然而,DataConmplate中的DataConmplate由ItemsControl设置为当前项,在您的情况下,这是Terminals - 集合的成员。因此,找不到TerminalTypes集合(除非您在项目上也实现它)。

您可以做的是在Binding中使用相对来源。这样,您可以导航到DataGrid的DataContext,然后访问您的TerminalTypes - 集合:

<ComboBox DisplayMemberPath="TTYPE_NAME"
    SelectedValuePath="TERMINAL_TYPE"
    SelectedValue="{Binding TERMINAL_TYPE_ID}"
    ItemsSource="{Binding DataContext.TerminalTypes,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid}" /> 

希望这有帮助。如果没有,请发表评论。

答案 1 :(得分:1)

你应该看看Aran Mulholland的this answer

它有一个使用DataGridComboBoxColumn

的好样本

为您的XAML改编this article

<my:DataGridComboBoxColumn SelectedValueBinding="{Binding TERMINAL_TYPE_ID}"
  SelectedValuePath="TERMINAL_TYPE_ID"
  DisplayMemberPath="TERMINAL_TYPE"
  Header="Terminal Type"
  ItemsSource="{Binding TerminalTypes}" />

</my:DataGridComboBoxColumn>

答案 2 :(得分:0)

这是我在我的小测试项目中最终得到的结果,我会在适当的代码中使用它。

<Grid>
    <Controls:DataGrid Name="MenuDetailGrid" AutoGenerateColumns="False" ItemsSource="{Binding Terminals}">
        <Controls:DataGrid.Columns>
            <Controls:DataGridTemplateColumn Header="SomeHeader">
                <Controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding TTYPE_NAME}" />
                    </DataTemplate>
                </Controls:DataGridTemplateColumn.CellTemplate>
                <Controls:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox DisplayMemberPath="TTYPE_NAME"
                            SelectedValuePath="TERMINAL_TYPE_ID"
                            SelectedValue="{Binding TERMINAL_TYPE_ID}"
                            ItemsSource="{Binding DataContext.TerminalTypes,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Controls:DataGrid}}" />
                    </DataTemplate>
                </Controls:DataGridTemplateColumn.CellEditingTemplate>
            </Controls:DataGridTemplateColumn>
        </Controls:DataGrid.Columns>
    </Controls:DataGrid>
</Grid>