Определение DataGridTemplateColumn.Header вызывает исключение «Указанный элемент уже является логическим дочерним элементом другого элемента. Отключите его первым» - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть приложение MVVM WPF.Это приложение имеет две сетки данных.

Одна из них имеет DataGridTemplateColumn среди других.Этот DataGridTemplateColumn вызывает исключение при перезагрузке пользовательского интерфейса.Ниже снимок экрана ошибки (Примечание: если я удаляю этот DataGridTemplateColumn, тогда все работает нормально, исключение не возникает):

Это на испанском языке.На английском языке это звучит так: «Указанный элемент уже является логическим потомком другого элемента. Сначала отключите его» * ​​1005 *

enter image description here

Я обнаружил, что виновник - это когда яопределите заголовок DataGridTemplateColumn, выполнив следующие действия:

<dg:DataGridTemplateColumn.Header>
    <StackPanel  Orientation="Horizontal" >
        <Image RenderOptions.BitmapScalingMode="NearestNeighbor"
               Width="32" Height="32" 
               Source="/My.Utilities.Resources;component/Images/MyIcon.png"/>
        <TextBlock Text="Show PDF" VerticalAlignment="Center"/>
    </StackPanel>
</dg:DataGridTemplateColumn.Header>

Если я удаляю над разделом DataGridTemplateColumn.Header, он работает, и исключение не возникает.Зачем?Как решить эту проблему?

DataGrid инициализируется путем присвоения Списку элементов свойству DataSource DataSource.

Ресурсы DataGrid:

<!-- DataGrid Resources -->
<dg:DataGrid.Resources>
    <proxy:BindingProxy x:Key="myProxy" Data="{Binding}" />                       
</dg:DataGrid.Resources>

и класс Proxy::

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

DataGridTemplateColumn, как показано ниже.В основном, он содержит ссылку, которая при нажатии вызывает команду с параметром.Этот параметр является именем файла PDF, содержащегося в другом столбце той же таблицы данных:

<dg:DataGridTemplateColumn MinWidth="100" Width="auto">
    <dg:DataGridTemplateColumn.Header>
        <StackPanel  Orientation="Horizontal" >
            <Image RenderOptions.BitmapScalingMode="NearestNeighbor"
                   Width="32" Height="32" 
                   Source="/My.Utilities.Resources;component/Images/MyIcon.png"/>
            <TextBlock Text="Show PDF" VerticalAlignment="Center"/>
        </StackPanel>
    </dg:DataGridTemplateColumn.Header>
    <dg:DataGridTemplateColumn.CellTemplate>                               
        <DataTemplate>
                <TextBlock VerticalAlignment="Center">  

                    <Hyperlink Command="{Binding Path=Data.ShowPdf, Source={StaticResource myProxy}}" 
                               CommandParameter="{Binding Path=FileName}" >
                        Show PDF
                    </Hyperlink>                

                </TextBlock>
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>

1 Ответ

0 голосов
/ 29 ноября 2018

Я решил это.Я изменил способ определения заголовка DataGridTemplateColumn, изменив:

<dg:DataGridTemplateColumn.Header>
    <StackPanel  Orientation="Horizontal" >
        <Image RenderOptions.BitmapScalingMode="NearestNeighbor"
               Width="32" Height="32" 
               Source="/My.Utilities.Resources;component/Images/MyIcon.png"/>
        <TextBlock Text="Show PDF" VerticalAlignment="Center"/>
    </StackPanel>
</dg:DataGridTemplateColumn.Header>

на этот:

<dg:DataGridTemplateColumn.HeaderStyle>
    <Style TargetType="dg:DataGridColumnHeader">
      <Setter Property="ContentTemplate">
        <Setter.Value>
             <DataTemplate>
                 <StackPanel  Orientation="Horizontal" >
                      <Image RenderOptions.BitmapScalingMode="NearestNeighbor"
                           Width="32" Height="32"                              Source="/My.Utilities.Resources;component/Images/MyIcon.png"/>
                      <TextBlock Text="Show PDF" VerticalAlignment="Center"/>
                 </StackPanel>
             </DataTemplate>
        </Setter.Value>
      </Setter>
     </Style>
</dg:DataGridTemplateColumn.HeaderStyle>

Теперь он работает как шарм!

У меня естьнашел решение здесь , предложенное Frydex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...