定义DataGridTemplateColumn.Header导致“指定的元素已经是另一个元素的逻辑子元素。请先断开连接”异常

时间:2018-11-29 18:24:40

标签: c# wpf mvvm visual-studio-2008 .net-3.5

我有一个MVVM WPF应用程序。该应用程序有两个数据网格。

其中之一具有DataGridTemplateColumn等。重新加载UI时,此DataGridTemplateColumn导致异常。错误屏幕快照下方(注意:如果我删除此DataGridTemplateColumn,则一切正常,没有异常):

它是西班牙语。用英语是:“指定的元素已经是另一个元素的逻辑子代。请先断开连接”

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部分,那么它将起作用并且不会引发异常。为什么?该如何解决?

通过为ItemsSource datagrid属性分配一个项目列表来初始化DataGrid。

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如下。基本上,它包含一个链接,单击该链接时,它将调用带有参数的命令。此参数是包含在同一datagrid的另一列中的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 :(得分:0)

我已经解决了。我通过更改更改了定义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提出的解决方案here