programing

WPF 오류: 대상 요소의 지배 FrameworkElement를 찾을 수 없습니다.

oldcodes 2023. 4. 19. 23:27
반응형

WPF 오류: 대상 요소의 지배 FrameworkElement를 찾을 수 없습니다.

나 있어DataGrid이미지가 있는 행이 있습니다.이 이미지는 트리거로 특정 상태에 바인딩되어 있습니다.상태가 바뀌면 이미지를 바꾸고 싶습니다.

템플릿 자체는 에 설정되어 있습니다.HeaderStyleDataGridTemplateColumn이 템플릿에는 몇 가지 바인딩이 있습니다.첫 번째 바인딩 날짜는 요일을 나타내며 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또는Headeretc(단, 이러한 속성은 유효한 종속성 속성입니다!)

이게 어떻게 가능하지?그거 아니야?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

반응형