WPF UserControl无法呈现。 UserControl使用DataTemplates实例化

时间:2014-01-18 01:31:59

标签: c# wpf user-controls datatemplate

我有一个用户控件,我试图通过数据模板显示。不幸的是,控制从未显示出来。这是DataTemplate:

        <DataTemplate x:Key="listViewTemplate">
                <ctrls:SpecialControl/>
        </DataTemplate>

如果我在这些DataTemplate标签中放置常规控件,我可以看到它们。然而,我的SpecialControl不会显示。这是我的SpecialControl的xaml文件:

<UserControl x:Class="CustomControls.SpecialControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d">

<StackPanel>
    <CheckBox Content="Hello World" />
    <Button >
        <TextBlock Text="Goodbye world"/>
    </Button>
</StackPanel>

</UserControl>

由于某种原因,此控件在运行时是不可见的。如果我将它们直接放入模板中,我会看到它们。我知道我可以这样做,但我希望使用数据绑定和自定义行为对这个类做一些更复杂的事情。我尝试使用Snoop,我可以在那里看到我的SpecialControl,其中ContentPresenter不可扩展:没有复选框或按钮的迹象。

修改:

以下是使用SpecialControl的View:我遗漏了许多我正在使用的模板,因为我不希望它过于拥挤。

<UserControl x:Class="Tools.EditorWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
         xmlns:ctrls="clr-namespace:CustomControls"
         xmlns:local="clr-namespace:Tools"
         mc:Ignorable="d"
         x:Name="This">

<UserControl.Resources>

  <!--More templates -->  

         <DataTemplate x:Key="groupBoxTemplate" >  
        <ctrls:SpecialGroupBox Header="{Binding Path=Title}" Margin="2" DockPanel.Dock="Top">

            <ItemsControl ItemsSource="{Binding guiItemsList}" ItemTemplateSelector="{DynamicResource guiTemplateSelector}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel>

                        <!-- Set up the width of the individual items based on how many   columns we are supposed to have and what the adjusted width of the wrapPanel is. This way the 4th item will be placed on the 2nd row if the ColumnCount is 3. -->
                        <WrapPanel.ItemWidth>
                            <MultiBinding Converter="{StaticResource itemWidthConverter}">
                                <Binding Path="ColumnCount"/>
                                <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
                            </MultiBinding>
                        </WrapPanel.ItemWidth> 


                    </WrapPanel>
                </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </ctrls:SpecialGroupBox>
    </DataTemplate>  

  <DataTemplate x:Key="listViewTemplate">
            <ctrls:SpecialControl/>
    </DataTemplate>     


   <local:GuiTemplateSelector 
     ... <!--More templates -->
   GroupBoxTemplate="{StaticResource groupBoxTemplate}"
   SpecialTemplate="{StaticResource listViewTemplate}"
   x:Key="guiTemplateSelector"/>
</UserControl.Resources>
<DockPanel>

    <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="1">
        <StackPanel Name="rootPanel" DockPanel.Dock ="Top" Width="Auto" Height="Auto">

            <ItemsControl ItemsSource="{Binding guiItemsList}" ItemTemplateSelector=" {StaticResource guiTemplateSelector}">
            </ItemsControl>
        </StackPanel>
    </ScrollViewer>
</DockPanel>

</UserControl>

如果您想知道SpecialGroupBox的作用,它会保留其他控件,以某种方式定位它们。在这个窗口中有一些它们可以工作。它位于我的SpecialControl应该出现的其中一个SpecialGroupBox中。

2 个答案:

答案 0 :(得分:1)

您的UserControl是否有相应的.xaml.cs文件?这个问题好像不会发生。

如果您正在使用Visual Studio,请尝试从UserControl复制所有XAML,然后从项目中删除它,添加新的UserControl(与之前的名称相同),然后将内容粘贴回XAML文件。这将确保您设置正确的.xaml.cs文件。

请参阅this answer

答案 1 :(得分:0)

在你的帖子中,你没有提到你如何使用listViewTemplate。如果您使用内部列表视图/列表框,您可以尝试这样,它将加载用户控件:

<ListView ItemsSource="{Binding Items}">
            <ListView.ItemTemplate>
                <DataTemplate >
                    <ContentControl ContentTemplate="{StaticResource listviewDataTemplate}" Content="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>