Ошибка 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')




почему эта ошибка показывает?

1110   1  

1 ответ:

к сожалению, любой DataGridColumn размещенной в разделе DataGrid.Columns не входит Visual дерево и поэтому не связано с контекстом данных datagrid. Поэтому привязки не работают с их свойствами, такими как Visibility или Header etc (хотя эти свойства являются допустимыми свойствами зависимостей!).

теперь вы можете задаться вопросом, как это возможно? Разве это не их 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

    Ничего не найдено.