WPF错误:无法find目标元素的治理FrameworkElement

我有一个具有图像的行的数据网格。 这个图像被绑定到某个状态的触发器。 当状态改变时,我想改变图像。

模板本身设置在DataGridTemplateColumn的HeaderStyle上。 这个模板有一些绑定。 第一个绑定日显示它是哪一天,并且状态用触发器改变图像。

这些属性在ViewModel中设置。

属性:

public class HeaderItem { public string Day { get; set; } public ValidationStatus State { get; set; } } this.HeaderItems = new ObservableCollection<HeaderItem>(); for (int i = 1; i < 15; i++) { this.HeaderItems.Add(new HeaderItem() { Day = i.ToString(), State = ValidationStatus.Nieuw, }); } 

数据网格:

 <DataGrid x:Name="PersoneelsPrestatiesDataGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AutoGenerateColumns="False" SelectionMode="Single" ItemsSource="{Binding CaregiverPerformances}" FrozenColumnCount="1" > <DataGridTemplateColumn HeaderStyle="{StaticResource headerCenterAlignment}" Header="{Binding HeaderItems[1]}" Width="50"> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <TextBox Text="{ Binding Performances[1].Duration,Converter={StaticResource timeSpanConverter},Mode=TwoWay}"/> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock TextAlignment="Center" Text="{ Binding Performances[1].Duration,Converter={StaticResource timeSpanConverter}}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid> 

Datagrid HeaderStyleTemplate:

  <Style x:Key="headerCenterAlignment" TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Text="{Binding Day}" /> <Image x:Name="imageValidation" Grid.Row="1" Width="16" Height="16" Source="{StaticResource imgBevestigd}" /> </Grid> <ControlTemplate.Triggers> <MultiDataTrigger > <MultiDataTrigger.Conditions> <Condition Binding="{Binding State}" Value="Nieuw"/> </MultiDataTrigger.Conditions> <Setter TargetName="imageValidation" Property="Source" Value="{StaticResource imgGeenStatus}"/> </MultiDataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> 

现在,当我启动项目的图像不显示,我得到这个错误:

 System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=HeaderItems[0]; DataItem=null; target element is 'DataGridTemplateColumn' (HashCode=26950454); target property is 'Header' (type 'Object') 

任何想法为什么这个错误显示? 提前感谢

不幸的是, DataGridColumn下承载的任何DataGridColumn不是Visual树的一部分,因此没有连接到数据网格的数据上下文。 所以绑定不能与他们的属性,如VisibilityHeader等(虽然这些属性是有效的依赖属性!)。

现在你可能知道怎么可能? 他们的Binding属性是不是应该绑定到数据上下文? 那么它只是一个黑客。 绑定不起作用。 它实际上是复制 / 克隆这个绑定对象并用它来显示自己内容的datagrid单元格!

所以,现在回到解决您的问题,我假设HeaderItems是设置为您的父视图的DataContext对象的属性。 我们可以通过我们称之为ProxyElement东西将视图的DataContext连接到任何DataGridColumn

下面的例子说明了如何将一个逻辑子(如ContextMenuDataGridColumn连接到父视图的DataContext

  <Window x:Class="WpfApplicationMultiThreading.Window5" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vb="http://schemas.microsoft.com/wpf/2008/toolkit" Title="Window5" Height="300" Width="300" > <Grid x:Name="MyGrid"> <Grid.Resources> <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/> </Grid.Resources> <Grid.DataContext> <TextBlock Text="Text Column Header" Tag="Tag Columne Header"/> </Grid.DataContext> <ContentControl Visibility="Collapsed" Content="{StaticResource ProxyElement}"/> <vb:DataGrid AutoGenerateColumns="False" x:Name="MyDataGrid"> <vb:DataGrid.ItemsSource> <x:Array Type="{x:Type TextBlock}"> <TextBlock Text="1" Tag="1.1"/> <TextBlock Text="2" Tag="1.2"/> <TextBlock Text="3" Tag="2.1"/> <TextBlock Text="4" Tag="2.2"/> </x:Array> </vb:DataGrid.ItemsSource> <vb:DataGrid.Columns> <vb:DataGridTextColumn Header="{Binding DataContext.Text, Source={StaticResource ProxyElement}}" Binding="{Binding Text}"/> <vb:DataGridTextColumn Header="{Binding DataContext.Tag, Source={StaticResource ProxyElement}}" Binding="{Binding Tag}"/> </vb:DataGrid.Columns> </vb:DataGrid> </Grid> </Window> 

上面的视图遇到了如果我没有实现ProxyElement hack你发现相同的绑定错误。 ProxyElement是从主视图中窃取 DataContext任何FrameworkElement,并将其提供给逻辑子(如ContextMenuDataGridColumn 。 为此,它必须作为一个Content托pipe在一个不可见的ContentControl下,这是在同一个视图下。

我希望这能指导你正确的方向。