2016-07-25 12 views
0

Ich installiere das gleiche UserControl zweimal. Beide haben Radiobuttons und teilen den GroupName. Wenn ich eins auswähle, werden alle anderen deaktiviert, selbst wenn sie Teil einer anderen UserControl-Instanz sind.WPF Radio Button Group Kollision mit benutzerdefinierten Bedienelementen

Wie kann dieser GroupName Collision vermieden werden?

ist hier ein minimales Beispiel den Punkt zu veranschaulichen:

Haupt XAML

<Window x:Class="RadioDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <UserControl x:Name="First"/> 
     <UserControl x:Name="Second"/> 
    </StackPanel> 
</Window> 

Hauptcodebehind

public MainWindow() 
{ 
    InitializeComponent(); 
    Loaded += MainWindow_Loaded; 
} 

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    First.Content = new MyRadio(); 
    Second.Content = new MyRadio(); 
} 

MyRadio XAML

<UserControl x:Class="RadioDemo.MyRadio" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel> 
     <RadioButton GroupName="G" x:Name="RadioOne" Content="RadioOne"/> 
     <RadioButton GroupName="G" x:Name="RadioTwo" Content="RadioTwo"/> 
    </StackPanel> 
</UserControl> 

Antwort

2

Sie gr erstellen Übergeben Sie den Namen dynamisch, sobald das Benutzersteuerelement geladen ist.

XAML:

<StackPanel> 
    <RadioButton GroupName="{Binding GroupNameValue}" x:Name="RadioOne" Content="RadioOne"/> 
    <RadioButton GroupName="{Binding GroupNameValue}" x:Name="RadioTwo" Content="RadioTwo"/> 
</StackPanel> 

View-Modell:

private string groupNameValue = Guid.NewGuid().ToString(); 

public string GroupNameValue 
{ 
    protected get { return this.groupNameValue; } 
    set 
    { 
     this.SetProperty(ref this.groupNameValue, value); 
    } 
} 

Wo SetProperty ist die Umsetzung von INotifyPropertyChanged.
Hier habe ich Guid als Garantie für die Einzigartigkeit verwendet, aber Sie können verwenden, ob Sie möchten.

Mit kann C# 6.0-Code vereinfacht werden:

private string groupNameValue = Guid.NewGuid().ToString(); 

public string GroupNameValue => this.groupNameValue; 
+0

Saubere Lösung wäre ein weiterer Ansatz eine Abhängigkeit propertery auf dem Usercontrol zu erklären sein, um den Groupnamen zu halten. So könnten Sie bei Bedarf den gleichen GroupName an mehrere UC's anhängen. – Funk