【问题标题】:Selected radio button is changed when selected tab is changed更改选定选项卡时更改选定的单选按钮
【发布时间】:2015-05-24 07:56:14
【问题描述】:

我有一个绑定到可观察集合的选项卡控件。每个选项卡显示一个单选按钮组。当标签更改时,出于某种原因,它取消了所选的单选按钮。

可观察集合中的每个项目都为其自己的选项卡存储选定的单选按钮。我相信这意味着他们不能互相干扰。我还认识到每个组只能选择一个单选按钮。然而,每个选项卡都在其自己的组中。为什么选项卡改变时选中的单选按钮会改变?

XAML

<TabControl x:Name="MainTabControl" >
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding TabName}"></TextBlock>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*" />
                    <ColumnDefinition Width="1*" />
                    <ColumnDefinition Width="1*" />
                </Grid.ColumnDefinitions>
                <RadioButton x:Name="RadioButtonX"
                             Grid.Column="0"
                             VerticalAlignment="Center"
                             Content="X"
                             IsChecked="{Binding XChecked}" />
                <RadioButton x:Name="RadioButtonY"
                             Grid.Column="1"
                             VerticalAlignment="Center"
                             Content="Y"
                             IsChecked="{Binding YChecked}" />
                <RadioButton x:Name="RadioButtonZ"
                             Grid.Column="2"
                             VerticalAlignment="Center"
                             Content="Z"
                             IsChecked="{Binding ZChecked}" />
            </Grid>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

C#

public partial class MainWindow
{
    public ObservableCollection<RadioButtonSettings> listOfButtonSettings { get; set; }

    public MainWindow()
    {
        listOfButtonSettings = new ObservableCollection<RadioButtonSettings>
        {
            new RadioButtonSettings {TabName = "tab1"},
            new RadioButtonSettings {TabName = "tab2"},
            new RadioButtonSettings {TabName = "tab3"}
        };

        InitializeComponent();
       MainTabControl.ItemsSource = listOfButtonSettings;
    }
}

public class RadioButtonSettings
{
    public string TabName { get; set; }
    public bool XChecked { get; set; }
    public bool YChecked { get; set; }
    public bool ZChecked { get; set; }

    public RadioButtonSettings()
    {
        XChecked = true;
    }
}

【问题讨论】:

    标签: c# wpf radio-button tabcontrol


    【解决方案1】:

    此问题描述为here

    解决方法是使用上面链接中所写的 RadioButtonExtended 类。然后,您可以将 XAML 更改为以下内容,它将按预期工作:

     <RadioButtonExtended x:Name="RadioButtonX"
         Grid.Column="0"
         VerticalAlignment="Center"
         Content="X"
         IsCheckedReal="{Binding XChecked}" />
     <RadioButtonExtended x:Name="RadioButtonY"
         Grid.Column="1"
         VerticalAlignment="Center"
         Content="Y"
         IsCheckedReal="{Binding YChecked}" />
     <RadioButtonExtended x:Name="RadioButtonZ"
         Grid.Column="2"
         VerticalAlignment="Center"
         Content="Z"
         IsCheckedReal="{Binding ZChecked}" />
    

    【讨论】:

    • 不能说我太同意继承了。这可以在视图模型中解决,方法是使 RadioButtonSettings 实现 INotifyPropetyChanged 并在“选中”属性时取消选择其他属性。充分利用 MVVM 并管理 VM 中的逻辑
    【解决方案2】:

    我可以说每个选项卡的单选按钮名称都相同。因此,当您在 tab2 上设置 Y 时,在 tab2 上 X 将被取消选中,但因为它在 tab1 上具有相同的名称,所以也将被取消选中!另外,如果你在 tab1 上选择 Y 复选框,当你改变选项卡时,Y 将自动取消选中,因为在每个选项卡上,首先,X 被选中!

    您的复选框需要一个唯一的名称。但是,据我所知,没有将名称绑定到属性的方法。总之,我个人的看法是,您必须分别创建每个选项卡控件,并为复选框赋予唯一的名称。

    希望对你有帮助!

    【讨论】:

    • 正如您在我的问题中看到的,我的单选按钮是在 DataTemplate 中创建的。我不能为每个复选框指定唯一的名称。
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多