2010-05-20 11 views
10

Ich verwende ein WPF-Tab-Steuerelement, um separate wiederholte Instanzen eines Benutzersteuerelements darzustellen. h. Tab1 für Item1-Einstellungen, Tab2 für Item2-Einstellungen und so weiter.WPF-Benutzer steuert auf separaten Registerkarten: Warum wird Radiobutton Gruppenname zwischen den Registerkarten freigegeben?

Es scheint, dass die Namen der Optionsfeldgruppen zwischen den Registerkarten gemeinsam genutzt werden. Was ist los?

Einfaches Beispiel:

Ein Fenster enthält Registerkarten. Jede Registerkarte enthält ein Benutzersteuerelement.

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

Die Steuer Benutzer ist einfach zwei Radiobuttons in einer Gruppe:

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

Wenn Sie diese App ausführen, werden Sie nur die radiobutton1 in der zweiten Registerkarte sehen, dass wird überprüft, obwohl der Benutzer es definiert, um beim Start immer überprüft zu werden.

Wenn Sie einen Radiobutton als eingecheckten Code festlegen, werden alle Radiobuttons in anderen Tabs deaktiviert!

Es sieht so aus, als würden sich die Dinge unter Mauskontrolle gut verhalten (d. H. Tabs sind unabhängig).

Schließlich scheinen die Benutzersteuerungen separate Instanziierungen zu sein. Ich habe dies beispielsweise mit Schiebereglern auf Benutzersteuerelementen versucht, und sie verhalten sich unabhängig voneinander über Registerkarten hinweg. Wie sie sollten.

Danke für die Hilfe von jemandem mit diesem. Ich habe weitgehend vergebens gesucht. Sicher bin ich nicht die einzige Person, die dieses Problem hatte. Ich verwende VS2008.

Antwort

12

Ohne den GroupName-Satz funktioniert es. Dies ist nicht unbedingt notwendig, da die RadioButtons in einem Container automatisch automatisch gruppiert werden. Zum Beispiel:

<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

Das funktioniert. Vielen Dank. Also die Gruppenname Eigenschaft scheint völlig unnötig, und Sie können Radiobuttons immer in Container trennen ... – Daniel

+0

Genau. Sie benötigen nur GroupName, wenn Sie RadioButtons in demselben Container gruppieren möchten. Aber selbst dann könntest du sie in einen leeren Rand oder ähnliches legen. –

+0

Was, wenn zwei Radiobuttons unter verschiedenen Containern in derselben Gruppe sein sollen? Z.B. Sie haben zwei Optionsfelder in verschiedenen Stack-Panel (aus irgendeinem Grund), aber nur eines von ihnen auf einmal ausgewählt werden soll? – digitguy

5

Dieses Verhalten ist von Entwurf:

der ganze Sinn des Gruppennamen ist, damit Sie Radio-Buttons , die als Gruppe agieren definieren, ohne von der gleichen Mutter enthalten sein, die Panel.

Bitte lesen Sie this article für detaillierte Erklärung.

sprechen zu kurz, gibt es zwei Lösungen für zwei verschiedene Fälle:

  • Wenn Sie alle Radio-Buttons in einem Container logisch, nicht angeben Groupname dann bezogen haben. In diesem Fall bilden Optionsfelder automatisch eine Gruppe, die unabhängig von anderen Optionsfeldgruppen ist.

  • Wenn Sie logisch zusammenhängende Optionsfelder für Layoutzwecke auf mehrere Bereiche aufteilen, dann finden Sie unter read the article eine ausführliche Erklärung, was zu tun ist.

0

Ich hatte eine Situation, in der das Design die Trennung der Radios in separate Stapel nicht zuließ. Also, was ich getan habe, war entfernen GroupName von der XAML und erzwingen die Gruppierung aus dem Modell. Diese Idee stammt von this link, z.B.

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"); 
    } 
} 
Verwandte Themen