2010-05-20 11 views
10

J'utilise un contrôle d'onglet WPF pour présenter des instances répétées séparées d'un contrôle utilisateur. c'est-à-dire Tab1 pour les paramètres Item1, Tab2 pour les paramètres Item2, et ainsi de suite.Contrôles utilisateur WPF sur des onglets séparés: pourquoi le nom de groupe radiobutton est-il partagé entre les onglets?

Il semble que les noms des groupes de boutons radio soient partagés entre les onglets. Que se passe-t-il? Exemple:

Une fenêtre contient des onglets. Chaque onglet contient un contrôle utilisateur.

<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> 

Le contrôle utilisateur est simplement deux boutons radio dans un groupe:

<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 vous exécutez cette application, vous verrez que seul le radiobutton1 dans le deuxième onglet est vérifié, malgré le contrôle userc qui le définit pour toujours être vérifié au démarrage. De plus, le réglage d'un radiobutton comme vérifié dans le code semble décocher tous les boutons radio dans les autres onglets!

Il semble que les choses se comportent bien sous le contrôle de la souris (c'est-à-dire que les onglets sont indépendants). Enfin, les commandes usercontrol semblent être des instanciations séparées. J'ai essayé cela avec des curseurs sur les contrôles utilisateur, par exemple, et ils se comportent indépendamment entre les onglets. Comme ils devraient.

Merci pour l'aide de tout le monde avec ceci. J'ai cherché largement en vain. Je ne suis sûrement pas la seule personne à avoir eu ce problème. J'utilise VS2008.

Répondre

12

Sans le paramètre GroupName, cela fonctionne. Ce n'est pas strictement nécessaire puisque les RadioButtons dans un conteneur sont automatiquement groupés de toute façon. Par exemple:

<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

Les travaux. Merci. La propriété groupname semble donc totalement inutile et vous pouvez toujours séparer les radiobuttons en conteneurs ... – Daniel

+0

Exactement. Vous auriez seulement besoin de GroupName si vous voulez grouper RadioButtons dans le même conteneur. Mais même alors, vous pouvez les mettre dans une bordure vide ou similaire. –

+0

Que faire si vous voulez que deux boutons radio sous différents conteneurs soient dans le même groupe? Par exemple. vous avez deux boutons radio dans un panneau de pile différent (pour une raison quelconque) mais vous voulez en sélectionner un seul à la fois? – digitguy

5

Ce comportement est:

le point entier de GroupName est de vous permettre de définir des boutons radio qui agissent en tant que groupe sans avoir à être contenu par le même parent panneau.

Veuillez lire this article pour une explication détaillée.

Pour parler brièvement, il y a deux solutions pour deux cas différents:

  • Si vous avez tous les boutons radio liés logiquement dans un conteneur, puis ne prévoient pas expressément GroupName. Dans ce cas, les boutons radio formeront automatiquement un groupe indépendant de tout autre groupe de boutons radio.

  • Si vous divisez des boutons radio liés logiquement sur plusieurs panneaux à des fins de mise en page, alors read the article pour une explication détaillée de ce que vous devez faire.

0

J'avais une situation où la conception ne permettait pas la séparation des radios en piles séparées. Donc, ce que j'ai fait était de supprimer GroupName du xaml et d'appliquer le regroupement à partir du modèle. Cette idée vient de this link, par ex.

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"); 
    } 
} 
Questions connexes