Я использую 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; }
Проблема, которую я получаю, заключается в том, что DataGrid
ItemsSource
Binding
переопределяет путь Binding
для CombobBox
ItemsSource
, а также Command
Binding
. 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
. Я также не хочу использовать код позади.
Пожалуйста помоги.
Для вашего сценария мы предлагаем использовать 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, единственное, что сейчас не работает, это отсутствие значений при загрузке и значений в раскрывающемся списке, он остается пустым
Хорошо, вы можете присвоить своей модели представления x:name и использовать x:bind для привязки определенного свойства.
Нужно сделать мой ListValues статическим, чтобы он работал, возможно ли x: привязать к нестатическому списку? Тогда мне тоже нужна статическая команда, и там тоже будут проблемы?
Не могли бы вы создать новую тему для описания вашей проблемы, трудно решить вашу проблему в ваших комментариях.
Привет @NicoZhu, я задал еще один вопрос Ссылка на сайте
Работает ли следующий ответ, и есть ли у вас какие-либо обновления?