数据上下文在 DataGridTemplateColumn 中不可用

我有以下网格:


<DataGrid 

    x:Name="CandiesDataGrid" 

    ItemsSource="{Binding Candies}" 

    SelectedItem="{Binding SelectedCandy}">


    <i:Interaction.Triggers>

        <i:EventTrigger EventName="SelectionChanged">

            <i:InvokeCommandAction Command="{Binding CandySelectedCommand}"/>

        </i:EventTrigger>

    </i:Interaction.Triggers>


    <DataGrid.Columns>

        <DataGridTextColumn KeyboardNavigation.IsTabStop="False" IsReadOnly="True" Width="100" Header="{l:LocText Candy_Prop1}" Binding="{Binding CandyInfo.Name}"/>

        <DataGridTemplateColumn >

            <DataGridTemplateColumn.CellTemplate>

                <DataTemplate>

                    <CheckBox Name="IsConfirmed" Grid.Column="0"

                        Style="{StaticResource CandyCheckBox}"

                        IsChecked="{Binding IsConfirmed, Mode=TwoWay}"

                        Margin="-75 0 0 0"

                        Command="{Binding IsConfirmedCommand}">


                    </CheckBox>

                </DataTemplate>

            </DataGridTemplateColumn.CellTemplate>

        </DataGridTemplateColumn>


    </DataGrid.Columns>

</DataGrid>

我的财产使用OnPropertyChanged. 它不仅不改变 的值IsConfirmed,而且也不执行ICommand IsConfirmedCommand.


我在网上搜索了一下,似乎DataGridTemplateColumn丢失ItemSource了datagrid。


我确实尝试在复选框RelativeSource后输入mode=TwoWay,但它不起作用。


有什么方法可以访问我的 TemplateColumn 中的 ItemSource 吗?


不负相思意
浏览 76回答 1
1回答

蓝山帝景

在 CellTemplate 中,DataContext 是 DataGrid 行,无论它是什么(Candy在本例中)。因此,默认情况下,该Candy实例将是Source该 DataTemplate 中任何 Binding 的属性。绑定将在此处查找 Path 中指定的属性(在本例中IsConfirmed为 和IsConfirmedCommand)。这就是您想要的:网格中有多于一行,而该行通常是您在单元格中关心的内容。该字段或字段:但单元格模板通常需要查看多个字段,因此它们会为您提供整行。但在这种情况下,您想要返回并从父视图模型中获取一些内容。Viewmodel 没有自然的父/子层次结构,但如果您愿意,您可以给它们一个层次结构:Candy 可以拥有一个Parent引用拥有该Candies集合的 viewmodel 的属性。如果你这样做了,你可以像这样绑定:Command="{Binding Parent.IsConfirmed}"但这并不常见。我不知道这是否是一个特别好的主意。我们不需要这样做的原因之一是我们可以告诉绑定使用不同的源。UI 元素确实具有自然的父/子层次结构,并且绑定可以对其进行导航。如果你做得正确,你的父视图模型将是某个地方的 DataContext。{Binding Path=DataContext.IsConfirmed,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; RelativeSource={RelativeSource AncestorType=DataGrid}}“向上遍历 UI 树,直到找到 DataGrid。这就是您的源。现在,一旦有了源,就找到源对象的 DataContext 属性(如果有)。如果它有 DataContext,则获取 DataContext 的值并查看该对象对于一些名为 IsConfirmed 的属性。”DataGrid 有一个 DataContext 属性。由于您的绑定有效Candies,我们知道 DataContext 必须是具有属性的类Candies。你向我保证班级IsConfirmed也有。因此:<DataTemplate>&nbsp; &nbsp; <CheckBox&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Style="{StaticResource CandyCheckBox}"&nbsp; &nbsp; &nbsp; &nbsp; IsChecked="{Binding DataContext.IsConfirmed,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RelativeSource={RelativeSource AncestorType=DataGrid}}"&nbsp; &nbsp; &nbsp; &nbsp; Margin="-75 0 0 0"&nbsp; &nbsp; &nbsp; &nbsp; Command="{Binding DataContext.IsConfirmedCommand,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RelativeSource={RelativeSource AncestorType=DataGrid}}"&nbsp; &nbsp; &nbsp; &nbsp; /></DataTemplate>
打开App,查看更多内容
随时随地看视频慕课网APP