Связывание как с моделью представления, так и с исходной сущностью в UWP - PullRequest
0 голосов
/ 09 марта 2020

Я использую компонент DataGrid, предоставляемый как часть UI Community Toolkit, и хотел бы иметь пару ячеек, которые показывают раскрывающийся список (ComboBox).

Элемент ItemsSource для раскрывающегося списка должен поступить из модель представления, тогда как SelectedItem должен привязываться к контексту текущего элемента (строки).

<tc:DataGrid ItemsSource="{Binding GridItems}">
  <tc:DataGrid.Columns>
    <tc:DataGridTemplateColumn Tag="ExampleColumn" Header="Example Column">
      <tc:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <ComboBox ItemsSource="{Binding <ViewModelProperty>}" SelectedItem="{Binding <ContextProperty>}" />
        </DataTemplate>
      </tc:DataGridTemplateColumn.CellTemplate>
    </tc:DataGridTemplateColumn>
    ...
  </tc:DataGrid.Columns>
</tc:DataGrid>

Как настроить привязки для ComboBox, чтобы ItemsSource извлекалось из модели представления страницы, в то время как SelectedItem привязывается к текущему элементу в коллекции GridItems.

В большинстве статей говорится об использовании RelativeSource и AncestorType, но я не думаю, что они доступны в приложениях UWP.

1 Ответ

0 голосов
/ 10 марта 2020

Как настроить привязки для ComboBox так, чтобы ItemsSource извлекался из модели представления страницы, тогда как SelectedItem привязывался к текущему элементу в коллекции GridItems.

DataContext из ComboBox является текущим элементом (например, модель) в коллекции GridItems, если вы хотите связать SelectedItem с текущим элементом в коллекции GridItems, просто свяжите свойство из текущего элемента с SelectedItem , А для ItemsSource, если вы хотите связать с моделью представления страницы, вы можете подписаться на событие Загрузка ComboBox и затем установить списки из модели представления страницы в ItemsSource в этом событии. Например:

.xaml:

<tc:DataGrid ItemsSource="{Binding GridItems}">
    <tc:DataGrid.Columns>
        <tc:DataGridTemplateColumn Tag="ExampleColumn" Header="Example Column">
            <tc:DataGridTemplateColumn.CellTemplate>
                <DataTemplate x:DataType="local:Model">
                    <ComboBox Loading="ComboBox_Loading" SelectedItem="{Binding MySelectedItemFromModel}"/>
                </DataTemplate>
            </tc:DataGridTemplateColumn.CellTemplate>
        </tc:DataGridTemplateColumn>
    </tc:DataGrid.Columns>
</tc:DataGrid>

.cs:

private void ComboBox_Loading(FrameworkElement sender, object args)
{
    ComboBox box = sender as ComboBox;
    box.ItemsSource = ViewModelFromPage.Lists;
}
...