在 UWP 项目中,如何将组合框绑定到与其父 DataGrid ItemSsource 不同的 ItemsSource?
How do I bind a comboBox to a different ItemsSource than it's parent DataGrid's ItemSource in a UWP project?
我正在使用 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
覆盖了 CombobBox
的 [=] 的 Binding
路径21=],以及 Command
的 Binding
。 ListValues
和 ToggleSwitchToggled_Command
在 DataGridData
内查找。
例如:
Error: BindingExpression path error: 'ListValues' property not found on 'UWPProject.ViewModels.DataGridData'. BindingExpression: Path='ListValues' DataItem='UWPProject.ViewModels.DataGridData'; target element is 'Windows.UI.Xaml.Controls.ComboBox' (Name='null'); target property is 'ItemsSource' (type 'Object')
在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>
所以我想,问题是,如何拆分在父 DataGrid
中查找 Binding
的“源”或路径。关于这个有很多WPF
问答,比如 and 。但是我不能使用 DataContext
,因为我收到“DataContext is not supported in a UWP project
”的错误。我找不到针对此问题的 UWP 项目的解决方案。另外,我正在使用 MVVM 并且没有代码隐藏,所以我不相信我可以使用 x:Binding
。我也不想使用代码隐藏。
请帮忙。
对于您的场景,我们建议使用 DataGridComboBoxColumn
来替换自定义单元格模板。然后你可以使用 x:bind 标记扩展来直接绑定列表 属性 。
因为 DataGridComboBoxColumn
ItemsSource 属性 无法直接访问数据源子 属性,如果您已经为页面 class 创建了 ListValues
属性,您可以也可以使用 x:bind 访问,如下所示。
<controls:DataGridComboBoxColumn
Width="*"
Binding="{Binding p2}"
Header="Link"
ItemsSource="{x:Bind ListValues ,Mode=OneWay}"
Tag="Link"
/>
如果您确实想要制作自定义单元格模板,您可以将 ListValues 属性 插入到您的 CustomClass
中。详情请参考.
我正在使用 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
覆盖了 CombobBox
的 [=] 的 Binding
路径21=],以及 Command
的 Binding
。 ListValues
和 ToggleSwitchToggled_Command
在 DataGridData
内查找。
例如:
Error: BindingExpression path error: 'ListValues' property not found on 'UWPProject.ViewModels.DataGridData'. BindingExpression: Path='ListValues' DataItem='UWPProject.ViewModels.DataGridData'; target element is 'Windows.UI.Xaml.Controls.ComboBox' (Name='null'); target property is 'ItemsSource' (type 'Object')
在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>
所以我想,问题是,如何拆分在父 DataGrid
中查找 Binding
的“源”或路径。关于这个有很多WPF
问答,比如DataContext
,因为我收到“DataContext is not supported in a UWP project
”的错误。我找不到针对此问题的 UWP 项目的解决方案。另外,我正在使用 MVVM 并且没有代码隐藏,所以我不相信我可以使用 x:Binding
。我也不想使用代码隐藏。
请帮忙。
对于您的场景,我们建议使用 DataGridComboBoxColumn
来替换自定义单元格模板。然后你可以使用 x:bind 标记扩展来直接绑定列表 属性 。
因为 DataGridComboBoxColumn
ItemsSource 属性 无法直接访问数据源子 属性,如果您已经为页面 class 创建了 ListValues
属性,您可以也可以使用 x:bind 访问,如下所示。
<controls:DataGridComboBoxColumn
Width="*"
Binding="{Binding p2}"
Header="Link"
ItemsSource="{x:Bind ListValues ,Mode=OneWay}"
Tag="Link"
/>
如果您确实想要制作自定义单元格模板,您可以将 ListValues 属性 插入到您的 CustomClass
中。详情请参考