gpt4 book ai didi

WPF错误: Cannot find governing FrameworkElement for target element

转载 作者:行者123 更新时间:2023-12-03 05:14:14 25 4
gpt4 key购买 nike

我有一个 DataGrid,其中一行包含图像。该图像通过触发器绑定(bind)到某种状态。当状态改变时我想改变图像。

模板本身是在 DataGridTemplateColumnHeaderStyle 上设置的。该模板有一些绑定(bind)。第一个绑定(bind)日显示今天是哪一天,并且状态通过触发器更改图像。

这些属性在 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>

数据网格标题样式模板:

<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')

为什么会出现这个错误?

最佳答案

遗憾的是,DataGrid.Columns 下托管的任何 DataGridColumn 都不是 Visual 树的一部分,因此未连接到数据网格的数据上下文。因此,绑定(bind)不适用于其属性,例如 VisibilityHeader 等(尽管这些属性是有效的依赖属性!)。

现在您可能想知道这怎么可能?它们的 Binding 属性不是应该绑定(bind)到数据上下文吗?好吧,这只是一个黑客。绑定(bind)实际上不起作用。实际上,数据网格单元复制/克隆此绑定(bind)对象并使用它来显示自己的内容!

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

下面的示例说明了如何将逻辑子项(例如 ContextMenuDataGridColumn)连接到父 View 的 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,上面的 View 会遇到与您发现的相同的绑定(bind)错误。 ProxyElement 是任何从主视图中窃取 DataContext 并将其提供给逻辑 subview 的 FrameworkElement,例如 ContextMenuDataGridColumn。为此,它必须作为 Content 托管到同一 View 下的不可见 ContentControl 中。

我希望这能引导您走向正确的方向。

关于WPF错误: Cannot find governing FrameworkElement for target element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7660967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com