使用ItemControl和DataBinding时,RadioButton分组无法在WPF中工作

时间:2018-01-25 11:50:12

标签: c# wpf xaml data-binding radiobuttonlist

在使用WPF表单和使用DataBinding时,我遇到了组合RadioButtons的麻烦。

如果我手动创建我的控件,行为就像预期的那样,用户只能从radiobutton组中选择一个项目(底部的GroupBox),但如果我使用嵌套的ItemControls生成我的布局并使用数据绑定分组不按预期工作,允许用户在一个组(顶部groupBox)中选择多个radiobutton,如此链接屏幕截图1中所示。

我尝试绑定GroupName属性,但无法以某种方式找到用于GroupName属性的绑定属性。 也许可以使用同一网格行中TextBlock的Text属性,但是我找不到合适的Binding语法来引用它。

让分组工作的方法是什么?

这是XAML:

<Window x:Class="RadioButtonMadness.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" Title="MainWindow" SizeToContent="WidthAndHeight">

    <Window.Resources>
        <Style TargetType="RadioButton">
            <Setter Property="Margin" Value="10" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="Height" Value="22" />
        </Style>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="10" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="Height" Value="22" />
        </Style>
    </Window.Resources>

    <Grid>
        <Grid.ColumnDefinitions />
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <GroupBox Header="Prognostic factors - NOK">
            <ItemsControl ItemsSource="{Binding PrognosticFactors}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Name="PrognosticFactors" Grid.Row="0" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="1*"/>
                                <ColumnDefinition Width="2*"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions />
                            <TextBlock Text="{Binding Title}" />
                            <ItemsControl ItemsSource="{Binding Options}" Grid.Column="1">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Horizontal" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <RadioButton Content="{Binding Key}" />
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </GroupBox>
        <GroupBox Header="Prognostic factors - OK" Grid.Row="1">
            <StackPanel>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"/>
                        <ColumnDefinition Width="2*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions/>
                    <TextBlock Text="Test4" Grid.Column="0"/>
                    <StackPanel Orientation="Horizontal" Grid.Column="1">
                        <RadioButton Content="One"/>
                        <RadioButton Content="Two"/>
                        <RadioButton Content="Three"/>
                    </StackPanel>
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"/>
                        <ColumnDefinition Width="2*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions />
                    <TextBlock Text="Test5" Grid.Column="0"/>
                    <StackPanel Orientation="Horizontal" Grid.Column="1">
                        <RadioButton Content="One"/>
                        <RadioButton Content="Two"/>
                        <RadioButton Content="Three"/>
                    </StackPanel>
                </Grid>
            </StackPanel>
        </GroupBox>
    </Grid>
</Window>

以及背后的代码:

using System;
using System.Collections.Generic;
using System.Windows;

namespace RadioButtonMadness
{
    public class Option
    {
        public String Key{ get; set; }
        public Double Value { get; set; }

        public Option(String key, Double value)
        {
            Key = key;
            Value = value;
        }
    }

    public class PrognosticFactor
    {
        private String title;
        public List<Option> Options
        {
            get
            {
                var list = new List<Option>();
                list.Add(new Option("One", 1));
                list.Add(new Option("Two", 2));
                list.Add(new Option("Three", 3));
                return list;
            }
        }

        public String Title
        {
            get { return title; }
        }

        public PrognosticFactor(String value)
        {
            title = value;
        }
    }

    public class ViewModel
    {
        public List<PrognosticFactor> PrognosticFactors
        {
            get
            {
                var list = new List<PrognosticFactor>();
                list.Add(new PrognosticFactor("Test1"));
                list.Add(new PrognosticFactor("Test2"));
                list.Add(new PrognosticFactor("Test3"));
                return list;
            }
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new ViewModel();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

只需将GroupName绑定到Title属性即可。你可以这样做:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <RadioButton Content="{Binding Key}" GroupName="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}, Path=DataContext.Title}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>
相关问题