Ошибка WPF: не удается найти управляющий FrameworkElement для целевого элемента
у меня есть datagrid со строкой, которая имеет изображение. Этот образ привязан триггером к определенному состоянию. Когда состояние меняется, я хочу изменить изображение.
сам шаблон устанавливается на HeaderStyle DataGridTemplateColumn. Этот шаблон имеет некоторые привязки. Первый день привязки показывает, какой это день, и состояние изменяет изображение с помощью триггера.
эти свойства задаются в 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:
<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>
Теперь, когда я запускаю проект, изображения не отображаются, и я получаю эту ошибку:
система.Окна.Ошибка данных: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path=HeaderItems[0]; DataItem=null; целевой элемент - 'DataGridTemplateColumn' (HashCode=26950454); целевой свойство ' Header '(тип 'Object')
почему эта ошибка показывает?
1 ответ:
к сожалению, любой
DataGridColumnразмещенной в разделеDataGrid.Columnsне входитVisualдерево и поэтому не связано с контекстом данных datagrid. Поэтому привязки не работают с их свойствами, такими какVisibilityилиHeaderetc (хотя эти свойства являются допустимыми свойствами зависимостей!).теперь вы можете задаться вопросом, как это возможно? Разве это не их
Bindingсвойство должно быть привязано к контексту данных? Ну это просто Хак. Привязка не работает. Это на самом деле ячейки datagrid, которые скопировать/клон это привязка объекта и использовать его для отображения собственного содержимого!Итак, теперь вернемся к решению вашей проблемы, я предполагаю, что
HeaderItems- это свойство объекта, которое задается какDataContextвашего родительского представления. Мы можете подключитьDataContextиз вида на любойDataGridColumnчерез то, что мы называемProxyElement.в приведенном ниже примере показано, как подключить логическое ребенка например,
ContextMenuилиDataGridColumnк родительскому виду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. ProxyElement-это любой FrameworkElement, который украл the
DataContextиз основного вида и предлагает его логическому ребенку, напримерContextMenuилиDataGridColumn. Для этого он должен быть размещен какContentв невидимуюContentControlкоторый находится под тем же Вид.я надеюсь, что это поможет вам в правильном направлении.
Comments