Привязка элемента управления Combobox к отдельному источнику в DataGrid - PullRequest
2 голосов
/ 18 января 2011

Я пытаюсь использовать ComboBox в DataGrid, который позволит пользователю выбрать значение из другой таблицы. Я использую класс ViewModel в качестве DataContext, и он содержит ObservableCollection для терминалов и еще один для 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>

Очевидно, что поведение связывания в ComboBox отличается, когда он является частью DataGrid, но я немного озадачен, почему?

Может кто-нибудь помочь мне понять, что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 18 января 2011

Поведение привязки такое же.Однако DataContext в DataTemplate устанавливается с помощью ItemsControl для текущего элемента, и в вашем случае он является членом Terminals -коллекции.Поэтому коллекция TerminalTypes не может быть найдена (если вы не внедрили ее также и для вашего элемента).

Что вы можете сделать, это использовать относительный источник в вашей привязке.При этом вы можете перейти к DataContext DataGrid и затем получить доступ к вашей TerminalTypes -Коллекции:

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

Надеюсь, это помогло.Оставьте комментарий, если нет.

1 голос
/ 18 января 2011

Вы должны посмотреть на этот ответ от Арана Малхолланда.

Имеет хороший пример использования DataGridComboBoxColumn

Адаптировано эта статья для вашего XAML

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

</my:DataGridComboBoxColumn>
0 голосов
/ 19 января 2011

Это то, чем я закончил в своем маленьком тестовом проекте, я адаптирую его для использования в правильном коде.

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...