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
相关产品推荐
相关产品推荐

