2

かなり不自由ですがUserControl、SilverlightPageに 2 つ追加しようとしましたが、同じコントロール名がビジュアル ツリーに 2 回使用されていることを (徹底的に掘り下げて) 通知する例外が発生しました。内部のコントロールにUserControlは名前が付けられているため、一度に に含めることができるのは 1 つだけ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>
4

2 に答える 2

1

Xaml の要素に付けられる名前は、 namescope 内で一意である必要があります。LoadComponent を実行するたびに、新しい名前スコープが作成されます。したがって、UserControlコントロールの複数のインスタンスが使用された場合、 内の名前はビジュアル ツリーで競合しません。

したがって、現在の質問に対する答えは、「あなたが何か間違ったことをしているから」です。

「何か」が何であるかは、今のところ不明です。おそらく、質問に xaml を含めていただければ、私たちがお手伝いできます。

編集

したがって、行間を読むと、これがあなたがやっていることだと思います。プロパティの数を持つ UserControl があり、UserControl 内のコントロールをこれらのプロパティにバインドする必要があるため、これを行っています。

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

これは、xaml の上部にある要素に追加Name="UserControl"したことを示します。<UserControl..

問題を再現する方法を見つけることができませんが、このアプローチが問題となる以前のバージョンの SL の問題を認識しています。個人的には、コンポーネントの外部コンシューマに実際に属するプロパティを設定しない方がよいと思います (UserControl を使用しているページによって、名前が何であるか、名前が必要かどうかが決まります)。

したがって、この「UserControl自体にバインドする」という種類の問題を解決するための私のアプローチ:-

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

ここで、LayoutRoot はGrid、UserControl コンテンツのルートであるトップ レベルの名前です。Parentこれは、Grid のプロパティを介して UserControl 自体にバインドされます。ただし、これには、独自の xaml で UserControl 自体に名前を追加する必要はありません。

于 2011-09-14T19:11:45.857 に答える
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>
于 2011-09-14T18:44:06.180 に答える