You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF MVVM中DataGrid按钮TextBlock绑定DataContext报错求助

问题修复方案

你遇到的错误主要来自拼写失误和绑定路径逻辑错误,按以下步骤修改即可解决:

1. 修正控件名称拼写错误

WPF控件名称大小写敏感,代码里所有的{x:TypeExtension Datagrid}要改成{x:Type DataGrid}——小写的Datagrid不是系统认可的控件类型,这是触发报错的直接原因。

2. 修正ContactFullName的绑定路径

DataGrid的ItemsSource绑定的是CompanyContactsList,每个单元格模板(CellTemplate)的默认数据上下文就是列表里的单个联系人对象,不需要通过DataGrid的DataContext间接绑定,直接写{Binding ContactFullName}即可。

修正后的完整代码片段

<Grid Grid.Row="1">
    <DataGrid HorizontalAlignment="Left" 
              Width="Auto"
              ItemsSource="{Binding CompanyContactsList}"
              SelectedItem="{Binding SelectedContact, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              SelectionMode="Single"
              SelectionUnit="FullRow"
              IsReadOnly="True"
              AutoGenerateColumns="False"
              CanUserAddRows="False"
              >
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="FontSize" Value="12"/>
            </Style>
        </DataGrid.ColumnHeaderStyle>
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Name">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="ContactName"
                                Command="{Binding Path=DataContext.BtnContactName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                >
                            <Button.Template>
                                <ControlTemplate TargetType="{x:Type Button}">
                                    <Grid>
                                        <Image Source="..\..\Images\DG Cell Background.png"
                                               x:Name="ContactNameImg"/>
                                        <TextBlock Text="{Binding ContactFullName}"/>
                                    </Grid>
                                </ControlTemplate>
                            </Button.Template>
                        </Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        <!-- ... MORE COLUMNS ... -->
        </DataGrid.Columns>
    </DataGrid>
</Grid>

额外说明

  • 按钮的Command绑定逻辑是正确的:因为BtnContactName是UserControl的ViewModel中的命令,所以需要通过RelativeSource找到DataGrid的DataContext来完成绑定。
  • 如果需要按钮有交互反馈(比如鼠标悬停样式),可以在ControlTemplate中添加Trigger实现,避免按钮看起来和普通文本无区别。

内容的提问来源于stack exchange,提问作者Progolfer79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:20:15