WPF dataGrid 单选按钮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF dataGrid 单选按钮相关的知识,希望对你有一定的参考价值。

<dg:DataGridTemplateColumn Header="选择">
<dg:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton x:Name="ck" Click="ck_Click" Tag="Binding ID" GroupName="SelectedItem"></RadioButton>
</DataTemplate>
</dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>

private void ck_Click(object sender, RoutedEventArgs e)

foreach (object ovj in datagrid.ItemsSource)

RadioButton cb1 = datagrid.Columns[0].GetCellContent(ovj).FindName("ck") as RadioButton;
cb1.IsChecked = false;

RadioButton rbtn = sender as RadioButton;
rbtn.IsChecked = true;


cb1 总是NULL 是怎么回事
能给一个解决问题的代码吗?

参考技术A 你这样写显然不对,这样违背代码与视图的分离原则。如果混合在一起。那视图分离就没有意义了。 参考技术B 没有你这种做法的。哪有datagrid里的单元格里只放一个radiobutton的。你可以在一个单元格放一个checkbox或者一组radiobutton,那才是有意义的。我不知道你的需求是什么,如果可以的话,说明下你的需求,我帮你看看怎么实现。 参考技术C WPF获取DataGrid的单元格非常难,参见我的另一个回答
http://zhidao.baidu.com/question/616072154406141612.html?oldq=1
在WPF里面尽量用绑定,直接访问后台的数据源,而不是像Winform那样去读界面的值。

将单选按钮组绑定到 WPF 中的属性

【中文标题】将单选按钮组绑定到 WPF 中的属性【英文标题】:binding radiobuttons group to a property in WPF 【发布时间】:2012-03-02 01:01:00 【问题描述】:

假设我有:

<RadioButton GroupName="Group1" IsChecked="Binding Path=RadioButton1IsChecked" />
<RadioButton GroupName="Group1" IsChecked="Binding Path=RadioButton2IsChecked" />

然后在我的数据源类中我有:

public bool RadioButton1IsChecked  get; set; 
public bool RadioButton2IsChecked  get; set; 
public enum RadioButtons  RadioButton1, RadioButton2, None 
public RadioButtons SelectedRadioButton

    get
    
        if (this.RadioButtonIsChecked) 
            return RadioButtons.RadioButton1;
        else if (this.RadioButtonIsChecked) 
            return RadioButtons.RadioButton2;
        else 
            return RadioButtons.None;
     

我可以以某种方式将我的单选按钮直接绑定到SelectedRadioButton 属性吗?我真的只需要 RadioButton1IsCheckedRadioButton2IsChecked 属性来计算选定的单选按钮。

【问题讨论】:

这个blog post 可能会有所帮助 见my answer on a related question,它应该有帮助。 SelectedItem 绑定到感兴趣的属性。 我更喜欢:***.com/questions/397556/… ***.com/a/2908885/986 How to bind RadioButtons to an enum?的可能重复 【参考方案1】:

声明一个类似于以下的枚举:

enum RadioOptions Option1, Option2

XAML:

<RadioButton IsChecked="Binding SelectedOption, Converter=StaticResource EnumBooleanConverter, ConverterParameter=x:Static local:RadioOptions.Option1"/>
<RadioButton IsChecked="Binding SelectedOption, Converter=StaticResource EnumBooleanConverter, ConverterParameter=x:Static local:RadioOptions.Option2"/>

转换器类:

public class EnumBooleanConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        return value.Equals(parameter);
    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
        return ((bool)value) ? parameter : Binding.DoNothing;
    

【讨论】:

与接受的答案有什么功能区别? @Jerther:接受的答案采用字符串参数并将其转换为枚举。这个直接接受一个枚举值,这是一个更好的主意,因为如果参数不正确,它将无法编译。【参考方案2】:
<RadioButton GroupName="Group1" IsChecked="Binding Path=SelectedRadioButton, Converter=StaticResource EnumBooleanConverter, ConverterParameter=RadioButton1" />
<RadioButton GroupName="Group1" IsChecked="Binding Path=SelectedRadioButton, Converter=StaticResource EnumBooleanConverter, ConverterParameter=RadioButton2" />
public enum RadioButtons  RadioButton1, RadioButton2, None 
public RadioButtons SelectedRadioButton get;set;

 public class EnumBooleanConverter : IValueConverter
    
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        
            var ParameterString = parameter as string;
            if (ParameterString == null)
                return DependencyProperty.UnsetValue;

            if (Enum.IsDefined(value.GetType(), value) == false)
                return DependencyProperty.UnsetValue;

            object paramvalue = Enum.Parse(value.GetType(), ParameterString);
            return paramvalue.Equals(value);
        

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        
            var ParameterString = parameter as string;
            var valueAsBool = (bool) value;

            if (ParameterString == null || !valueAsBool)
            
                try
                
                    return Enum.Parse(targetType, "0");
                
                catch (Exception)
                
                    return DependencyProperty.UnsetValue;
                
            
            return Enum.Parse(targetType, ParameterString);
        
    

【讨论】:

当任何单选按钮的IsChecked 属性设置为false 时,这不会将SelectedRadioButton 值设置为RadioButtons.None(通过执行return Enum.Parse(targetType, "0"); )吗?【参考方案3】:

我们可以动态创建单选按钮,ListBox 可以帮助我们做到这一点,无需转换器,非常简单。

优势如下: 如果有一天你的枚举类发生了变化,你不需要更新 GUI(XAML 文件)。

步骤如下: 创建一个 ListBox 并将列表框的 ItemsSource 设置为枚举,并将 ListBox 的 SelectedItem 绑定到 Selected 属性。 然后将创建每个 ListBoxItem 的单选按钮。

public enum RadioButtons
 
   RadioButton1, 
   RadioButton2, 
   None

第 1 步:将枚举添加到 Window、UserControl 或 Grid 等的静态资源中。
    <Window.Resources>
        <ObjectDataProvider MethodName="GetValues"
                            ObjectType="x:Type system:Enum"
                            x:Key="RadioButtons">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:RadioButtons" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
第 2 步:使用列表框和 Control Template 将其中的每个项目填充为单选按钮
    <ListBox ItemsSource="Binding Source=StaticResource RadioButtons" SelectedItem="Binding SelectedRadioButton, Mode=TwoWay" >
        <ListBox.Resources>
            <Style TargetType="x:Type ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <RadioButton
                                Content="TemplateBinding ContentPresenter.Content"
                                IsChecked="Binding Path=IsSelected,
                                RelativeSource=RelativeSource TemplatedParent,
                                Mode=TwoWay" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.Resources>
    </ListBox>

现在,享受吧~

参考资料: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/

【讨论】:

【参考方案4】:

XAML:

<RadioButton IsChecked="Binding Path=SelectedOption, UpdateSourceTrigger=PropertyChanged">Option1</RadioButton>
<RadioButton IsChecked="Binding Path=SelectedOption, UpdateSourceTrigger=PropertyChanged, Converter=v:NotBoolenConverter">Option2</RadioButton>

转换器:

public class NotBoolenConverter : IValueConverter
    
        public NotBoolenConverter()
        
        

        public override object Convert(
            object value,
            Type targetType,
            object parameter,
            CultureInfo culture)
        
            bool output = (bool)value;
            return !output;
        

        public override object ConvertBack(
            object value,
            Type targetType,
            object parameter,
            CultureInfo culture)
        
            bool output = (bool)value;
            return !output;
        
    

使用 2 个单选按钮,将一个绑定到另一个的反面。

【讨论】:

与其他答案相比,这看起来很不令人满意

以上是关于WPF dataGrid 单选按钮的主要内容,如果未能解决你的问题,请参考以下文章

C# WPF:当单选按钮显示为图像时,数据网格中的单选按钮分组不起作用

简单的 WPF 单选按钮绑定?

ItemsControl 上的 WPF MVVM 单选按钮

PowerShell\WPF:使用数据模板的 PowerShell 中的空单选按钮对象

WPF中的数据绑定单选按钮列表

将单选按钮组绑定到 WPF 中的属性