WPF用户控件在不同的选项卡上:为什么在选项卡之间共享radiobutton groupname?

时间:2010-05-20 06:22:48

标签: wpf user-controls radio-button tabcontrol groupname

我正在使用WPF选项卡控件来呈现用户控件的单独重复实例。即Item1设置的Tab1,Item2设置的Tab2等。

选项卡之间似乎正在共享单选按钮组名称。发生了什么事?

简单示例:

一个窗口包含标签。每个选项卡都包含一个用户控件。

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

用户控件只是一组中的两个单选按钮:

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

如果您运行此应用程序,您将看到只检查第二个选项卡中的radiobutton1,尽管用户控件将其定义为始终在启动时进行检查。

此外,在后面的代码中设置一个单选按钮,似乎取消选中其他标签中的所有单选按钮!

似乎在鼠标控制下事情表现良好(即标签是独立的)。

最后,用户控件似乎确实是单独的实例化。例如,我已尝试使用用户控件上的滑块,并且它们在标签之间的行为是独立的。他们应该这样做。

感谢任何人对此的帮助。我广泛搜索无济于事。当然,我不是唯一一个遇到过这个问题的人。我正在使用VS2008。

3 个答案:

答案 0 :(得分:16)

没有GroupName设置就可以了。由于一个容器中的RadioButtons无论如何都是自动分组的,因此不是必需的。例如:

<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 :(得分:5)

此行为是设计使然:

  

GroupName的重点是允许您定义单选按钮   作为一个群体而不必由同一父母包含   面板。

请阅读this article了解详细说明。

简单地说,对于两种不同的情况有两种解决方案:

  • 如果您在一个容器中包含所有逻辑相关的单选按钮,则不指定 GroupName 。在这种情况下,单选按钮将自动形成一个独立于任何其他单选按钮组的组。

  • 如果您在多个面板上拆分逻辑相关的单选按钮以进行布局,请read the article详细说明该怎么做。

答案 2 :(得分:0)

我遇到的情况是设计不允许将无线电分离成单独的堆栈。所以,我所做的是从xaml中删除GroupName并从模型中强制执行分组。这个想法来自this link,例如

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