Как привязать comboBox к другому ItemsSource, отличному от родительского ItemSource DataGrid в проекте UWP?

Я использую MVVM и привязываю DataGrid к ObservableCollection<CustomClass>. Я могу успешно это сделать, однако я хочу, чтобы один из столбцов DataGrid был столбцом ComboBox с источником элементов List<ComboBoxValues>. Также другой столбец должен быть ToggleSwitch, где Command с параметром запускается, когда его свойство IsOn изменяет значение.

В модели представления:

    public ObservableCollection<CustomClass> DataGridData { get; set; } = new ObservableCollection<CustomClass>();
    public List<ComboBoxValues> ListValues { get; set; } = new List<ComboBoxValues>();
    public MyICommand<ToggleSwitch> ToggleSwitchToggled_Command { get; private set; }

Проблема, которую я получаю, заключается в том, что DataGridItemsSourceBinding переопределяет путь Binding для CombobBoxItemsSource, а также CommandBinding. ListValues и ToggleSwitchToggled_Command ищется внутри DataGridData.

Например:

Ошибка: ошибка пути BindingExpression: свойство «ListValues» не найдено в «UWPProject.ViewModels.DataGridData». BindingExpression: Path='ListValues' DataItem='UWPProject.ViewModels.DataGridData'; целевой элемент — «Windows.UI.Xaml.Controls.ComboBox» (Name = «null»); целевое свойство — «ItemsSource» (тип «Объект»)

В XAML:

      <controls:DataGrid GridLinesVisibility = "All"
                         AlternatingRowBackground = "Gray" AutoGenerateColumns = "False"
                         ItemsSource = "{Binding DataGridData,Mode=TwoWay}">
            <controls:DataGrid.Columns>
                <controls:DataGridTextColumn Header = "TextOne" Binding = "{Binding aPropertyOneInDataGridData,Mode=TwoWay}"/>
                <controls:DataGridTextColumn Header = "TextTwo" Binding = "{Binding aPropertyTwoInDataGridData,Mode=TwoWay}"/>
                <controls:DataGridTemplateColumn Header = "ComboBoxHeader">
                    <controls:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation = "Horizontal" VerticalAlignment = "Center">
                                <ComboBox ItemsSource = "{Binding ListValues}"
                                          SelectedValue = "{Binding aPropertyThreeInDataGridData,Mode=TwoWay}"
                                          PlaceholderText = "Select Action">
                                </ComboBox>
                            </StackPanel>
                        </DataTemplate>
                    </controls:DataGridTemplateColumn.CellTemplate>
                </controls:DataGridTemplateColumn>
                <controls:DataGridTemplateColumn Header = "ToggleSwitch_Header">
                    <controls:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation = "Horizontal" VerticalAlignment = "Center">
                                <ToggleSwitch x:Name = "ToggelSwitch_Run"
                                              IsOn = "{Binding aPropertyFourInDataGridData,Mode=TwoWay}">
                                    <interact:Interaction.Behaviors>
                                        <interactcore:EventTriggerBehavior EventName = "Toggled">
                                            <interactcore:InvokeCommandAction Command = "{Binding ToggleSwitchToggled_Command}"
                                                                              CommandParameter = "{Binding}"/>
                                        </interactcore:EventTriggerBehavior>
                                    </interact:Interaction.Behaviors>
                                </ToggleSwitch>
                            </StackPanel>
                        </DataTemplate>
                    </controls:DataGridTemplateColumn.CellTemplate>
                </controls:DataGridTemplateColumn>
            </controls:DataGrid.Columns>
        </controls:DataGrid>

Итак, я думаю, вопрос в том, как мне разделить «источник» или путь, где Binding ищется внутри родителя DataGrid. По этому поводу есть много WPF вопросов и ответов, например здесь и здесь. однако я не могу использовать DataContext, так как получаю сообщение об ошибке «DataContext is not supported in a UWP project». Я не могу найти решение для проекта UWP для этой проблемы. Кроме того, я использую MVVM и не использую код, поэтому не думаю, что смогу использовать x:Binding. Я также не хочу использовать код позади.

Пожалуйста помоги.

Работает ли следующий ответ, и есть ли у вас какие-либо обновления?

Nico Zhu 17.12.2020 10:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
615
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для вашего сценария мы предлагаем использовать DataGridComboBoxColumn для замены пользовательского шаблона ячейки. Затем вы можете использовать расширение разметки x:bind для прямой привязки свойства списка. Поскольку свойство DataGridComboBoxColumn ItemsSource не может напрямую обращаться к подсвойству источника данных, если вы уже создали свойство ListValues для класса Page, вы также можете использовать x:bind для доступа, как показано ниже.

<controls:DataGridComboBoxColumn 
    Width = "*"
    Binding = "{Binding p2}"
    Header = "Link"   
    ItemsSource = "{x:Bind ListValues ,Mode=OneWay}"
    Tag = "Link"
    />

Если вы хотите создать собственный шаблон ячейки, вы можете вставить свойство ListValues ​​в свой CustomClass. Для получения более подробной информации см. ответ на этот случай.

кажется, я не могу использовать x:bind без свойств code-behind/ в файле .cs страницы. Я хочу строго использовать MVVM и, следовательно, не использовать программный код. Поэтому я не могу использовать x:bind. У меня есть код, использующий Binding, для DataGridComboBoxColumn, единственное, что сейчас не работает, это отсутствие значений при загрузке и значений в раскрывающемся списке, он остается пустым

Allstar 08.01.2021 15:04

Хорошо, вы можете присвоить своей модели представления x:name и использовать x:bind для привязки определенного свойства.

Nico Zhu 08.01.2021 15:06

Нужно сделать мой ListValues ​​статическим, чтобы он работал, возможно ли x: привязать к нестатическому списку? Тогда мне тоже нужна статическая команда, и там тоже будут проблемы?

Allstar 13.01.2021 14:37

Не могли бы вы создать новую тему для описания вашей проблемы, трудно решить вашу проблему в ваших комментариях.

Nico Zhu 13.01.2021 14:47

Привет @NicoZhu, я задал еще один вопрос Ссылка на сайте

Allstar 15.01.2021 05:58

Другие вопросы по теме