为了账号安全,请及时绑定邮箱和手机立即绑定

数据上下文在 DataGridTemplateColumn 中不可用

数据上下文在 DataGridTemplateColumn 中不可用

C#
不负相思意 2023-09-16 17:40:08
我有以下网格:<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 吗?
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

在 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, 

        RelativeSource={RelativeSource AncestorType=DataGrid}}

“向上遍历 UI 树,直到找到 DataGrid。这就是您的源。现在,一旦有了源,就找到源对象的 DataContext 属性(如果有)。如果它有 DataContext,则获取 DataContext 的值并查看该对象对于一些名为 IsConfirmed 的属性。”


DataGrid 有一个 DataContext 属性。由于您的绑定有效Candies,我们知道 DataContext 必须是具有属性的类Candies。你向我保证班级IsConfirmed也有。


因此:


<DataTemplate>

    <CheckBox 

        Style="{StaticResource CandyCheckBox}"

        IsChecked="{Binding DataContext.IsConfirmed, 

            RelativeSource={RelativeSource AncestorType=DataGrid}}"

        Margin="-75 0 0 0"

        Command="{Binding DataContext.IsConfirmedCommand,

            RelativeSource={RelativeSource AncestorType=DataGrid}}"

        />

</DataTemplate>


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信