2010-05-20 11 views
10

Estoy usando un control de pestaña WPF para presentar instancias repetidas separadas de un control de usuario. es decir, Tab1 para la configuración de Item1, Tab2 para configuración de Item2, y así sucesivamente.Controles de usuario de WPF en pestañas separadas: ¿por qué el nombre de grupo de radiobutton se comparte entre pestañas?

Parece que los nombres de los grupos de botones de radio se comparten entre pestañas. Que esta pasando?

Ejemplo simple:

Una ventana contiene pestañas. Cada pestaña contiene un control de usuario.

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:lib="clr-namespace:WpfApplication1" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <TabControl Margin="0,0,0,100" Name="tabControl1"> 
     <TabItem Header="tabItem1" Name="tabItem1"> 
      <lib:UserControl1 x:Name="userControlInTab1" /> 
     </TabItem> 
     <TabItem Header="tabItem2" Name="tabItem2"> 
      <lib:UserControl1 x:Name="userControlInTab2" /> 
     </TabItem> 
    </TabControl> 
</Grid> 

El control de usuario es simplemente dos botones de radio en un grupo:

<UserControl x:Class="WpfApplication1.UserControl1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="50" Width="100"> 
<StackPanel> 
    <RadioButton GroupName="Group1" Name="radiobutton1" Content="option1" IsChecked="True" /> 
    <RadioButton GroupName="Group1" Name="radiobutton2" Content="option2" /> 
</StackPanel> 

Si ejecuta esta aplicación, se verá que sólo el radiobutton1 en la segunda pestaña se comprueba, a pesar de que usercontrol lo define, siempre se verificará al inicio.

¡Además, configurar un botón de radio como código marcado detrás parece desmarcar todos los botones de radio en otras pestañas!

Parece que las cosas se comportan bien bajo el control del mouse (es decir, las pestañas son independientes).

Por último, los controles de usuario parecen ser instancias separadas. He intentado esto con controles deslizantes en controles de usuario, por ejemplo, y se comportan independientemente en pestañas. Como deberían.

Gracias por la ayuda de nadie con esto. He buscado ampliamente sin ningún resultado. Seguramente no soy la única persona que ha tenido este problema. Estoy usando VS2008.

Respuesta

12

Sin el conjunto GroupName funciona. No es estrictamente necesario ya que los RadioButtons en un contenedor se agrupan automáticamente de todos modos. Por ejemplo:

<UserControl x:Class="WpfApplication1.UserControl1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="50" Width="100"> 
    <StackPanel> 
     <StackPanel> 
      <RadioButton Name="radiobutton1" Content="option1" IsChecked="True" /> 
      <RadioButton Name="radiobutton2" Content="option2" /> 
     </StackPanel> 
     <StackPanel> 
      <RadioButton Name="radiobutton3" Content="option3" IsChecked="True" /> 
      <RadioButton Name="radiobutton4" Content="option4" /> 
     </StackPanel> 
    </StackPanel> 
</UserControl> 
+1

Las obras. Gracias. Así que la propiedad de nombre de grupo parece completamente innecesaria, y siempre puede separar los botones de radio en contenedores ... – Daniel

+0

Exactamente. Solo necesitaría GroupName si desea agrupar RadioButtons en el mismo contenedor. Pero incluso entonces podrías ponerlos en un borde vacío o similar. –

+0

¿Qué sucede si desea que dos botones de opción en diferentes contenedores estén en el mismo grupo? P.ej. tiene dos botones de opción en un panel de pila diferente (por alguna razón) pero quiere que solo se seleccione uno de ellos a la vez. – digitguy

5

Este comportamiento es por diseño:

todo el punto de NombreGrupo es permitir definir los botones de radio que actúan como un grupo sin tener que ser contenida por el mismo padre panel.

Por favor, lea this article para una explicación más detallada.

hablar brevemente, hay dos soluciones para dos casos diferentes:

  • Si todos ustedes han relacionado lógicamente botones de radio en un recipiente, a continuación, no se especifica una NombreGrupo. En este caso, los botones de opción formarán automáticamente un grupo que es independiente de cualquier otro grupo de botones de opción.

  • Si divide los botones de radio relacionados lógicamente en varios paneles para propósitos de diseño, entonces read the article para una explicación larga de qué hacer.

0

Tuve una situación donde el diseño no permitió la separación de las radios en pilas separadas. Entonces, lo que hice fue eliminar GroupName de la xaml e imponer la agrupación del modelo. Esta idea provino del this link, p.

private bool _useGaugeOpen; 
public bool UseGaugeOpen 
{ 
    get { return _useGaugeOpen; } 
    set 
    { 
     _useGaugeOpen = value; 
     _useATGOpen = !value; 
     RaisePropertyChanged("UseATGOpen");    
    } 
} 
private bool _useATGOpen; 
public bool UseATGOpen 
{ 
    get { return _useATGOpen; } 
    set 
    { 
     _useATGOpen = value; 
     _useGaugeOpen = !value; 
     RaisePropertyChanged("UseGaugeOpen"); 
    } 
} 
Cuestiones relacionadas