2011-09-14 19 views
2

かなりおいしかったですが、私はSilverlight Pageに2つのUserControlを追加しようとしましたが、同じコントロール名がビジュアルツリーに2回使用されていることを大規模な掘り下げで通知しています。したがって、私のUserControlのコントロールは名前がついているので、一度にPageにこのUserControlのうちの1つだけを含めることができます。これは本当ですか、それとも私は何かを実現していませんか?マイクロソフトは本当にコードの再利用をあきらめましたか?これは非常に不自由です。ページごとにSilverlight UserControlのインスタンスを1つしか持てませんか?

編集

ここに来る人のために、私はこの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> 
+0

@MichaelS、私はばかだとは思いません。それもコンパイルされません。 Reedが私に教えてくれたように、私の問題は、私はそれらをまったく名づけなかったということでした。 – Jordan

+1

@ Jordan:コントロールの名前を付けてもこの問題は通常発生しません。 SLのバージョン? Xaml?あなたの欲求不満感を制限してみてください。 – AnthonyWJones

+0

@ジョーダン、ちょうど助けようとしました.. – MichaelS

答えて

0

、それを割り当てることを確認してください固有の名前、つまり:

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

実際に私のユーザーコントロールに名前を付けると、それは斬新なアイデアです。そして、それはうまくいったので、進歩のためにこれでいいよ! – Jordan

1

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

これは、今のところ立っている質問の答えは、あなたが何か間違っているからです。

「何か」が何であるかは今は不明です。おそらくあなたがあなたのxamlを質問に含めたら、私たちはあなたを助けることができます。

編集

だから、これは私はあなたがやっている推測しているものです行の間に読みました。あなたは、プロパティの数を持っているユーザーコントロールを持って、あなたがこれをやっているので、ユーザーコントロール内のコントロールは、これらのプロパティにバインドする: -

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

をこれはあなたがで<UserControl..要素にName="UserControl"を追加したことを示すことになりますそのxamlの先頭。

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

したがって、私のアプローチは、問題の並べ替え、この「ユーザーコントロール自体にバインド」を解決するために: -

LayoutRootは、ユーザーコントロールのコンテンツのルートでトップレベル Gridの名前です
<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=LayoutRoot.Parent}"> 

。これは、グリッドのParentプロパティを介してUserControl自体にバインドします。ただし、独自のxamlでUserControl自体に名前を追加する必要はありません。

+0

私はXAMLを提供しました。私は本当に私が間違っていることを知ることに本当に興味があります。興味深いもの: – Jordan

+0

ええ、私はSilverlightで作業を始めた頃、このコントロールを作成しました。アドバイスありがとうございます。 – Jordan