2016-07-25 4 views
0

同じUserControlを2回インスタンス化します。どちらもRadiobuttonsを持ち、GroupNameを共有します。私が1つを選択すると、他のすべてが、別のUserControlインスタンスの一部であっても選択を解除します。WPFラジオボタングループのカスタムユーザーコントロールとの衝突

このGroupName Collisionを回避するにはどうすればよいですか?ここで

ポイントを説明するための最小限の例です。

メイン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> 

メイン分離コード

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> 

答えて

2

あなたはグラムを作成することができますユーザーコントロールが読み込まれると、動的に名前の値が返されます。

XAML:

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

ビューモデル:

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

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

SetPropertyINotifyPropertyChangedの実装です。
ここでは、一意性の保証としてGuidを使用しましたが、必要に応じて使用することができます。 C#6.0のコードを簡素化することができると

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

public string GroupNameValue => this.groupNameValue; 
+0

をクリーニング溶液、別のアプローチは、GroupNameのを保持するユーザーコントロールに依存properteryを宣言することであろう。同じように、必要なときに同じGroupNameをいくつかのUCに追加することができます。 – Funk