我有一个MVVM WPF应用程序。该应用程序有两个数据网格。
其中之一具有DataGridTemplateColumn等。重新加载UI时,此DataGridTemplateColumn导致异常。错误屏幕快照下方(注意:如果我删除此DataGridTemplateColumn,则一切正常,没有异常):
它是西班牙语。用英语是:“指定的元素已经是另一个元素的逻辑子代。请先断开连接”
当我通过执行以下操作定义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>
答案 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。