为什么每页只能有一个Silverlight UserControl实例?

时间:2011-09-14 18:37:12

标签: silverlight user-controls visual-tree

它非常蹩脚,但我尝试将两个UserControl添加到我的Silverlight Page,我得到一个例外告诉我(通过大量挖掘)相同的控件名称已被用于视觉树两次。因此,UserControl中的控件已命名,因此我一次只能将UserControl中的一个包含到Page中。这是真的吗,还是我没有意识到什么?微软真的放弃了代码重用吗?这非常蹩脚。

编辑

对于来到这里的人来说,我得到的是System.Resources.MissingManifestResourceException异常。花了一些时间才弄清楚问题是视觉树中的模糊名称。希望这会对你有所帮助。以下是完整的例外文字。

进一步修改

这是我的XAML:

<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <TextBlock x:Name="HeaderText"
        res:Strings.Assignment="Text=MachiningView_Name"/>

    <sdk:TabControl Grid.Row="2">
        <sdk:TabItem Header="Projects">
            <ScrollViewer>
                <Grid>
                    <controls:Organizer Margin="4" ItemsSource="{Binding ProjectSummaries}" Height="24" VerticalAlignment="Top">
                        <controls:Organizer.GroupDescriptions>
                            <controls:OrganizerGroupDescription res:Strings.Assignment="Text=NoGroupingText" IsDefault="True" />
                            <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupOwnerEmailText">
                                <controls:OrganizerGroupDescription.GroupDescription>
                                    <helpers:OwnerEmailGroupDescription />
                                </controls:OrganizerGroupDescription.GroupDescription>
                            </controls:OrganizerGroupDescription>
                            <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupStoreNumberText">
                                <controls:OrganizerGroupDescription.GroupDescription>
                                    <helpers:StoreNumberGroupDescription />
                                </controls:OrganizerGroupDescription.GroupDescription>
                            </controls:OrganizerGroupDescription>
                        </controls:Organizer.GroupDescriptions>
                    </controls:Organizer>
                </Grid>
            </ScrollViewer>
        </sdk:TabItem>
        <sdk:TabItem Header="Machine Queues">
            <ScrollViewer>
                <Grid>
                    <controls:Organizer Margin="4" ItemsSource="{Binding ProjectSummaries}" Height="24" VerticalAlignment="Top">
                        <controls:Organizer.GroupDescriptions>
                            <controls:OrganizerGroupDescription res:Strings.Assignment="Text=NoGroupingText" IsDefault="True" />
                            <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupOwnerEmailText">
                                <controls:OrganizerGroupDescription.GroupDescription>
                                    <helpers:OwnerEmailGroupDescription />
                                </controls:OrganizerGroupDescription.GroupDescription>
                            </controls:OrganizerGroupDescription>
                            <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupStoreNumberText">
                                <controls:OrganizerGroupDescription.GroupDescription>
                                    <helpers:StoreNumberGroupDescription />
                                </controls:OrganizerGroupDescription.GroupDescription>
                            </controls:OrganizerGroupDescription>
                        </controls:Organizer.GroupDescriptions>
                    </controls:Organizer>
                </Grid>
            </ScrollViewer>
        </sdk:TabItem>
    </sdk:TabControl>
</Grid>

这是我的用户控件的XAML:

<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=UserControl}">
    <sdk:Label Content="Page:" VerticalAlignment="Center" Margin="0,0,5,0"/>

    <sdk:DataPager Name="_projectSummariesPager"
                   Margin="0,0,5,0"
                   DisplayMode="FirstLastPreviousNextNumeric"
                   Source="{Binding Path=ItemsSource}"
                   PageSize="10"/>

    <ComboBox Name="_itemPerPageCombo"
              Margin="0,0,5,0" 
              SelectionChanged="_itemPerPageCombo_SelectionChanged"
              SelectedItem="{Binding Path=SelectedPageSize, Mode=TwoWay}"
              SelectedValuePath="Value"
              ItemsSource="{Binding Path=PageSizes}"/>

    <ComboBox Name="_groupDescription" 
              Margin="0,0,5,0" 
              SelectionChanged="_groupDescription_SelectionChanged"
              SelectedItem="{Binding Path=SelectedGroupDescription, Mode=TwoWay}"
              ItemsSource="{Binding Path=GroupDescriptions}"/>
</StackPanel>

2 个答案:

答案 0 :(得分:1)

Xaml中元素的名称在 namescope 中必须是唯一的。 LoadComponent的每次执行都会创建一个新的名称范围。因此,当使用多个控件实例时,UserControl中的名称在可视树中不会发生冲突。

现在问题的答案是:因为你做错了什么。

现在还不清楚“某事”是什么。也许如果您在问题中包含您的xaml,我们可以帮助您。

修改

所以在这两行之间阅读这是我猜你正在做的事情。你有一个UserControl,它有一个属性编号,你希望UserControl中的控件绑定到这些属性,所以你这样做: -

 <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=UserControl}">  

这表示您已将Name="UserControl"添加到其xaml顶部的<UserControl..元素。

我无法找到重现问题的方法,但我知道早期版本的SL存在问题,这种方法存在问题。我个人认为最好避免设置真正属于组件外部使用者的属性(它直到使用UserControl的页面,它的名称是什么以及它是否应该有名称)。

因此,我的方法是解决这个“绑定到UserControl本身”的问题: -

 <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=LayoutRoot.Parent}">

其中LayoutRoot是顶级Grid的名称,它是UserControl内容的根。这仍然通过Grid的Parent属性绑定到UserControl本身。但是,这不需要在其自己的xaml中将名称添加到UserControl本身。

答案 1 :(得分:0)

添加UserControl时,请确保为其指定唯一名称,即:

<Page ...
    <StackPanel>
         <local:YourUserControl x:Name="Foo" />
         <!-- Make sure not to duplicate x:Name/Name here! -->
         <local:YourUserControl x:Name="Bar" />
    </StackPanel>
</Page>