2011-05-24 13 views
9

Me gustaría mostrar la misma instancia de control de usuario dos veces. He intentado hacer lo siguiente:WPF .NET4.0 reutilizar la misma instancia de UserControl

<UserControl.Resources> 
    <Views:MyControl View x:Key="_uc1" MinHeight="300"/> 
</UserControl.Resources> 

Y tratando de usarlo en un TabControl:

<TabControl Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="3" > 
    <TabItem > 
     <TabItem.Header> 
      <TextBlock Text="Header1" FontWeight="13"/> 
     </TabItem.Header> 

     <StackPanel > 
      <ContentControl Content="{StaticResource _uc1}"/> 
     </StackPanel> 
    </TabItem> 
    <TabItem > 
     <TabItem.Header> 
      <TextBlock Text="Header2" FontWeight="13"/> 
     </TabItem.Header> 

     <StackPanel MinHeight="600" > 
      <ContentControl Content="{StaticResource _uc1}"/> 
     </StackPanel> 
    </TabItem> 
</TabControl> 

Im que consigue el mensaje de error: "{" elemento especificado ya está el niño lógica de otro elemento. Desconectarlo primero. "}"

¿Es lo que estoy intentando lograr?

Gracias,

Respuesta

6

No lo es. Como indica el error, un objeto dado solo puede estar presente en un árbol lógico dado una vez. Esto ayuda a garantizar que el árbol lógico sigue siendo un árbol .

Si está utilizando el patrón MVVM (o apenas está utilizando DataBinding en general,), entonces usted puede se unen dos UserControls diferentes al mismo respaldo ViewModel/datos, por lo que los controles se comportan de la misma y operar en la misma representación del estado Sin embargo, necesitarás dos controles diferentes.

+0

Esto hizo el truco. Vinculado a la misma fuente de datos (Ver modelo) Saludos. – TheRenoRanger

8

En WPF (y Silverlight) un control no puede estar en más de un lugar en el árbol visual. Lo que puede hacer es tener dos instancias separadas del control de usuario, pero enlazar sus propiedades relevantes a la misma fuente subyacente.

Por ejemplo, digamos que usted tenía un objeto de contacto y que quería dos instancias MyControl para referirse a la misma propiedad NombreCompleto.

<UserControl> 
    <UserControl.Resources> 
     <my:Contact x:Key="data" FullName="Josh Einstein" /> 
    </UserControl.Resources> 
    <TabControl DataContext="{StaticResource data}"> 
     <TabItem> 
     <TabItem.Header> 
      <TextBlock Text="Header1" FontWeight="13" /> 
     </TabItem.Header> 
     <StackPanel> 
      <!-- instance #1 --> 
      <Views:MyControl FullName="{Binding FullName, Mode=TwoWay}" /> 
     </StackPanel> 
     </TabItem> 
     <TabItem> 
     <TabItem.Header> 
      <TextBlock Text="Header2" FontWeight="13" /> 
     </TabItem.Header> 
     <StackPanel> 
      <!-- instance #2 --> 
      <Views:MyControl FullName="{Binding FullName, Mode=TwoWay}" /> 
     </StackPanel> 
     </TabItem> 
    </TabControl> 
</UserControl> 

Si lo que desea es un solo mando a aparece en varios lugares en el árbol visual, pero en realidad no ser interactivo, se puede utilizar una "pintura" VisualBrush que en otro control.

0

no se puede tener el mismo control en dos lugares, pero hacerla saltar, ver this answer mío para un ejemplo de cómo hacerlo.

Cuestiones relacionadas