在 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; }

我遇到的问题是 DataGridItemsSource Binding 覆盖了 CombobBox 的 [=] 的 Binding 路径21=],以及 CommandBindingListValuesToggleSwitchToggled_CommandDataGridData 内查找。

例如:

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 中。详情请参考.