У меня есть приложение MVVM WPF.Это приложение имеет две сетки данных.
Одна из них имеет DataGridTemplateColumn среди других.Этот DataGridTemplateColumn вызывает исключение при перезагрузке пользовательского интерфейса.Ниже снимок экрана ошибки (Примечание: если я удаляю этот DataGridTemplateColumn, тогда все работает нормально, исключение не возникает):
Это на испанском языке.На английском языке это звучит так: «Указанный элемент уже является логическим потомком другого элемента. Сначала отключите его» * 1005 *
![enter image description here](https://i.stack.imgur.com/pY5df.png)
Я обнаружил, что виновник - это когда яопределите заголовок 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>