WPF 오류: 대상 요소의 지배 FrameworkElement를 찾을 수 없습니다.
나 있어DataGrid
이미지가 있는 행이 있습니다.이 이미지는 트리거로 특정 상태에 바인딩되어 있습니다.상태가 바뀌면 이미지를 바꾸고 싶습니다.
템플릿 자체는 에 설정되어 있습니다.HeaderStyle
의DataGridTemplateColumn
이 템플릿에는 몇 가지 바인딩이 있습니다.첫 번째 바인딩 날짜는 요일을 나타내며 State는 트리거를 사용하여 이미지를 변경합니다.
이러한 속성은 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,
});
}
데이터 ID:
<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.데이터 오류: 2: 대상 요소의 지배 FrameworkElement 또는 FrameworkContentElement를 찾을 수 없습니다.BindingExpression:Path=DataItems[0]; DataItem=parget; 대상 요소는 'DataGridTemplateColumn'(HashCode=26950454); 대상 속성은 'Header'(유형 '개체')입니다.
이 에러는 왜 표시됩니까?
슬프게도 어느 쪽이든DataGridColumn
에서 주최하는.DataGrid.Columns
의 일부가 아니다Visual
따라서 데이터 그리드의 데이터 컨텍스트에 연결되지 않습니다.따라서 바인딩은 다음과 같은 속성과 함께 작동하지 않습니다.Visibility
또는Header
etc(단, 이러한 속성은 유효한 종속성 속성입니다!)
이게 어떻게 가능하지?그거 아니야?Binding
데이터 컨텍스트에 바인딩되어야 하는 속성입니까?그냥 해킹일 뿐이야바인딩이 제대로 작동하지 않습니다.이 바인딩 개체를 복사/복제하여 자신의 콘텐츠를 표시하는 데 사용하는 것은 실제로 데이터 클래스 셀입니다.
자, 이제 당신의 문제를 해결해보죠, 제 생각엔HeaderItems
는, 로서 설정되어 있는 오브젝트의 속성입니다.DataContext
참조할 수 있습니다.접속할 수 있습니다.DataContext
의 견해에 대하여DataGridColumn
라고 불리는 것을 통해서요.
다음 예시는 다음과 같은 논리적인 자아를 연결하는 방법을 보여 줍니다.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 hack을 구현하지 않은 경우 위와 같은 바인딩 오류가 발생했습니다.ProxyElement는 FrameworkElement를 도용하여DataContext
다음과 같은 논리적 하위 항목에게 제공합니다.ContextMenu
또는DataGridColumn
그러기 위해서는, 호스트로서Content
투명인간으로ContentControl
동일한 보기 아래에 있습니다.
이것이 당신을 올바른 방향으로 인도해 주길 바랍니다.
" " " 를 하는 StaticResource
은 '''입니다'''x:Reference
:
<StackPanel>
<!--Set the DataContext here if you do not want to inherit the parent one-->
<FrameworkElement x:Name="ProxyElement" Visibility="Collapsed"/>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn
Header="{Binding DataContext.Whatever, Source={x:Reference ProxyElement}}"
Binding="{Binding ...}" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
이 방법의 주요 장점은 DataGrid의 상위 요소가 아닌 경우(즉,StackPanel
에서는 그냥 .x:Reference
더미 '더미'를.FrameworkElement
★★★★★★★★★★★★★★★★★★.
'조상'이 .XamlParseException
순환 의존성으로 인해 런타임에 표시됩니다.
프록시가 없는 방법은 컨스트럭터에서 바인딩을 설정하는 것입니다.
var i = 0;
var converter = new BooleanToVisibilityConverter();
foreach(var column in DataGrid.Columns)
{
BindingOperations.SetBinding(column, DataGridColumn.VisibilityProperty, new Binding($"Columns[{i++}].IsSelected")
{
Source = ViewModel,
Converter = converter,
});
}
언급URL : https://stackoverflow.com/questions/7660967/wpf-error-cannot-find-governing-frameworkelement-for-target-element
'programing' 카테고리의 다른 글
출력의 여러 줄을 한 줄에 연결하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
---|---|
Git 푸시를 적절하게 강제하려면 어떻게 해야 하나요? (0) | 2023.04.19 |
UIButton의 image Size를 조정하는 방법 (0) | 2023.04.19 |
.bashrc를 .zshrc로 내보내려면 어떻게 해야 하나요? (0) | 2023.04.19 |
Excel VBA 변수를 중지하거나 아무것도 설정하지 않는 경우 (0) | 2023.04.19 |