Префикс 'xcdg' не сопоставляется с пространством имен
Я недавно начал играть с DataGridControl из расширенного инструментария WPF
<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
<xcdg:DataGridControl ItemsSource="{Binding Orders}" SelectionMode="Single" >
<xcdg:DataGridControl.View>
<xcdg:TableflowView FixedColumnCount="1" UseDefaultHeadersFooters="True" ShowRowSelectorPane="False" VerticalGridLineBrush="Green" VerticalGridLineThickness="2" HorizontalGridLineBrush="Purple" HorizontalGridLineThickness="2">
<xcdg:TableflowView.Theme>
<xcdg:ZuneNormalColorTheme/>
</xcdg:TableflowView.Theme>
</xcdg:TableflowView>
</xcdg:DataGridControl.View>
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="OrderID" IsMainColumn="True"/>
<xcdg:Column FieldName="ExternalID" />
<xcdg:Column FieldName="CustomerName" />
<xcdg:Column FieldName="Date" />
<xcdg:Column FieldName="Address" />
<xcdg:Column FieldName="Items" Width="*" />
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
</Grid>
Все нормально и все работает. Затем я добавил стиль.
<Style TargetType="{x:Type xcdg:DataGridControl}">
<Setter Property="Background" Value="MediumOrchid"/>
</Style>
Style
применяется и все снова работает. Итак, что я сделал дальше, создавая CotrolTemplate
используя Expression Blend и добавил этот шаблон в мой стиль.
<Style TargetType="{x:Type xcdg:DataGridControl}">
<Setter Property="Background"
Value="MediumOrchid" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type xcdg:DataGridControl}">
<Grid>
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
<AdornerDecorator x:Name="PART_DragDropAdornerDecorator">
<xcdg:TableViewScrollViewer x:Name="PART_ScrollViewer"
Padding="{TemplateBinding Padding}"
RowSelectorPaneWidth="{Binding (xcdg:DataGridControl.DataGridContext).RowSelectorPaneWidth, RelativeSource={RelativeSource Self}}"
ShowRowSelectorPane="{Binding (xcdg:DataGridControl.DataGridContext).ShowRowSelectorPane, RelativeSource={RelativeSource Self}}">
<xcdg:TableflowViewItemsHost />
</xcdg:TableViewScrollViewer>
</AdornerDecorator>
</Border>
<Grid x:Name="connectionStateGrid"
HorizontalAlignment="Right"
Height="30"
Margin="0,0,25,25"
VerticalAlignment="Bottom"
Width="30">
<ContentPresenter x:Name="connectionStateLoadingContentPresenter"
ContentTemplate="{Binding (xcdg:DataGridControl.DataGridContext).ConnectionStateLoadingGlyph, RelativeSource={RelativeSource Self}}"
Content="{TemplateBinding ConnectionState}"
Visibility="Collapsed" />
<ContentPresenter x:Name="connectionStateCommittingContentPresenter"
ContentTemplate="{Binding (xcdg:DataGridControl.DataGridContext).ConnectionStateCommittingGlyph, RelativeSource={RelativeSource Self}}"
Content="{TemplateBinding ConnectionState}"
Visibility="Collapsed" />
<ContentPresenter x:Name="connectionStateErrorContentPresenter"
ContentTemplate="{Binding (xcdg:DataGridControl.DataGridContext).ConnectionStateErrorGlyph, RelativeSource={RelativeSource Self}}"
Content="{TemplateBinding ConnectionState}"
Visibility="Collapsed" />
</Grid>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding (xcdg:DataGridControl.DataGridContext).IsConnectionStateGlyphEnabled, RelativeSource={RelativeSource Self}}"
Value="False">
<Setter Property="Visibility"
TargetName="connectionStateGrid"
Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding (xcdg:DataGridControl.DataGridContext).DataGridControl.ConnectionState, RelativeSource={RelativeSource Self}}"
Value="Loading">
<Setter Property="Visibility"
TargetName="connectionStateLoadingContentPresenter"
Value="Visible" />
<Setter Property="Visibility"
TargetName="connectionStateErrorContentPresenter"
Value="Collapsed" />
<Setter Property="Visibility"
TargetName="connectionStateCommittingContentPresenter"
Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding (xcdg:DataGridControl.DataGridContext).DataGridControl.ConnectionState, RelativeSource={RelativeSource Self}}"
Value="Committing">
<Setter Property="Visibility"
TargetName="connectionStateLoadingContentPresenter"
Value="Collapsed" />
<Setter Property="Visibility"
TargetName="connectionStateErrorContentPresenter"
Value="Collapsed" />
<Setter Property="Visibility"
TargetName="connectionStateCommittingContentPresenter"
Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding (xcdg:DataGridControl.DataGridContext).DataGridControl.ConnectionState, RelativeSource={RelativeSource Self}}"
Value="Error">
<Setter Property="Visibility"
TargetName="connectionStateLoadingContentPresenter"
Value="Collapsed" />
<Setter Property="Visibility"
TargetName="connectionStateErrorContentPresenter"
Value="Visible" />
<Setter Property="Visibility"
TargetName="connectionStateCommittingContentPresenter"
Value="Collapsed" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Но теперь целое ControlTemplate
подчеркнуто и говорит
Префикс "xcdg" не сопоставляется с пространством имен.
есть
xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid"
как в моем словаре ресурсов, так и в окне. Также дизайнер xaml создает исключение в "MainWindow.xaml", где помещается "DataGridControl". Это
ArgumentException: '{DependencyProperty.UnsetValue}' не является допустимым значением для свойства System.Windows.Controls.Control.Template в Setter.
Во время выполнения работает нормально. Все случилось после того как я добавил ControlTemplate
в Style
из DataGridControl
, Любое объяснение, почему это происходит или как этого избежать, будет высоко оценено.
2 ответа
Ну, это была просто проблема с VS2012 Xaml Designer, и это было сообщено и исправлено с помощью VS Update 3.
Похоже, эта проблема все еще существует в VS2017. исключение возникает при использовании привязки к свойствам зависимости с пространством имен.
Решение, которое я нашел, заключается в явном добавлении Path= к привязке.
Оригинальный код:
<DataTrigger Binding="{Binding (xcdg:DataGridControl.DataGridContext).IsConnectionStateGlyphEnabled, RelativeSource={RelativeSource Self}}" Value="False">
Модифицированный код:
<DataTrigger Binding="{Binding Path=(xcdg:DataGridControl.DataGridContext).IsConnectionStateGlyphEnabled, RelativeSource={RelativeSource Self}}" Value="False">
Я нашел решение в блоге Генриха Ульбрихта