Возможно ли связывание WPF с отдельными «строками» (не столбцами) сетки данных? - PullRequest
2 голосов
/ 26 февраля 2010

У меня есть датагрид. Столбец таблицы данных представляет собой простой <DataGridTemplateColumn> с его CellTemplate, содержащим <DataTemplate>, который содержит <ComboBox>, такой как

<my:DataGrid Name="dataGridMain" AutoGenerateColumns="False">
   <my:DataGrid.Columns>
       <my:DataGridTemplateColumn Header="Food" >
           <my:DataGridTemplateColumn.CellTemplate >
               <DataTemplate>
                  <ComboBox Name="comboDataTemplate" 
                            Text="{Binding Path=Food, 
                                           Mode=TwoWay, 
                                           UpdateSourceTrigger=PropertyChanged}"
                            ItemsSource="{Binding Source={StaticResource resFoodLookups}}"
                            DisplayMemberPath="FoodName" 
                            SelectedValuePath="FoodID" IsEditable="True" />
                </DataTemplate>
           </my:DataGridTemplateColumn.CellTemplate>
       </my:DataGridTemplateColumn>
    </my:DataGrid.Columns>
</my:DataGrid>

Все работает нормально. Каждый комбинированный список связан со статическим списком из-за оператора ItemsSource="{Binding Source={StaticResource resFoodLookups}}".


Но я требую, чтобы этот список менялся от строки к строке.

То есть: каждый раз, когда пользователь вводит новую запись в списке комбинированного списка в одной строке, я хочу, чтобы она была доступна в выделении в следующей строке.

По сути, я хочу создавать новый список для пользователя каждый раз, когда пользователь вставляет новое слово в поле со списком в любой из строк. (Комбо-бокс доступен для редактирования).

Теперь я могу подключить «ItemsSource = ...» во время выполнения, но я могу сделать это только один раз, поэтому <DataTemplate> распространяет «один и тот же» список на «все» выпадающие списки на «все» строки.

Я думаю, что мне нужно менять свойство ItemsSource = ... для каждого объекта отдельно в каждом комбинированном ящике, который создается в памяти после того, как их создал DataTemplate, но я понятия не имею, как это сделать .

1 Ответ

1 голос
/ 26 февраля 2010

Что вам нужно сделать, это выполнить двухстороннюю привязку данных к вашему ItemSource, таким образом, когда ItemSource обновляется в одном из комбинированных блоков, он автоматически обновит вашу исходную коллекцию и, следовательно, ваши другие комбинированные блоки.


Что я обычно делаю, это использую шаблон MVVM. Стоит провести некоторые исследования, если вы еще не используете определенный шаблон в своем приложении.

Используя его для решения вашей проблемы, я бы сделал следующее:

  1. Создание ViewModel (давайте назовем его MyViewModel), который имеет коллекцию значений под названием «MyComboBoxItems» (для работы привязки данных важно использовать ObservableCollection)

  2. Когда я создаю Window / Control, который содержит вашу таблицу, я также создаю экземпляр MyViewModel и устанавливаю его Window.DataContext = myViewModelInstance

  3. Для привязки в выпадающем списке используйте ItemsSource = "{Binding Path = MyComboBoxItems, Mode = TwoWay}

...