单选按钮、绑定、转换器

Posted

技术标签:

【中文标题】单选按钮、绑定、转换器【英文标题】:RadioButton, Binding, Converters 【发布时间】:2014-07-12 11:53:32 【问题描述】:

我正在使用 Visual Studio 2008,但我遇到了单选按钮问题。

我有 3 个单选按钮:

   <Window.Resources>
      // [...]
   <DataTemplate x:Key="gridViewReadyTemplate">
        <StackPanel>
            <RadioButton GroupName="Binding IdCommand" IsChecked="Binding CommandState, Mode=TwoWay, Converter=StaticResource enumBooleanConverter, ConverterParameter=ready" />
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="gridViewReportedTemplate">
        <StackPanel>
            <RadioButton GroupName="Binding IdCommand" IsChecked="Binding CommandState, Mode=TwoWay, Converter=StaticResource enumBooleanConverter, ConverterParameter=reported" />
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="gridViewCanceledTemplate">
        <StackPanel>
            <RadioButton GroupName="Binding IdCommand" IsChecked="Binding CommandState, Mode=TwoWay, Converter=StaticResource enumBooleanConverter, ConverterParameter=canceled" />
        </StackPanel>
    </DataTemplate>

    // [...]


   <ListView Margin="82,133.32,342.5,0" Name="listView1" ItemsSource="Binding CurrentTrain.PSCommandCollection, Mode=TwoWay" Height="111.25" VerticalAlignment="Top">
        <ListView.View>
            <GridView>
                // [...]
                <GridViewColumn Header="Préparé" Width="50" CellTemplate="StaticResource gridViewReadyTemplate " />
                <GridViewColumn Header="Reporté" Width="50" CellTemplate="StaticResource gridViewReportedTemplate " />
                <GridViewColumn Header="Annulé" Width="50" CellTemplate="StaticResource gridViewCanceledTemplate " />
            </GridView>
        </ListView.View>
    </ListView>

转换器:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    string param = (string)parameter;
    Enumerators.State state = (Enumerators.State)value;

    switch (param)
    
        case "ready":
            if (state == Enumerators.State.READY)
                return true;
            return false;
        case "reported":
            if (state == Enumerators.State.REPORTED)
                return true;
            return false;
        case "canceled":
            if (state == Enumerators.State.CANCELED)
                return true;
            return false;
    
    return false;


public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    string param = (string)parameter;

    if ((bool?)value == true)
    
        switch (param)
        
            case "ready":
                return Enumerators.State.READY;
            case "reported":
                return Enumerators.State.REPORTED;
            case "canceled":
                return Enumerators.State.CANCELED;
        
    
    return Enumerators.State.NONE;

以及单选按钮绑定的属性:

private Enumerators.State commandState;
public Enumerators.State CommandState

    get  return commandState; 
    set
    
        if (commandState != value)
        
            commandState = value;
            NotifyPropertyChanged("CommandState");
        
        else
        
            commandState = Enumerators.State.NONE;
            NotifyPropertyChanged("CommandState");
        
    

当我单击一个单选按钮时,状态变化良好。 问题是当我想通过单击取消选中单选按钮时,状态会发生变化,但单选按钮仍处于选中状态。

我在转换器函数 Convert 中设置了断点。例如,如果我想取消选中“准备好”,程序会进入 2 次,分别为“已报告”和“已取消”,而不是“准备好”...

我真的不明白问题出在哪里。 你能解释一下如何解决它吗?

【问题讨论】:

【参考方案1】:

这是RadioButton 的问题。一旦取消检查,它就会失去绑定。要解决此问题,您可以将 Radiobuttons 的 RadioButton.Command 绑定到您的 ViewModel 的命令,并发送一个唯一的 CommandParameter 来识别哪个按钮在命令处理程序中调用了该命令。

<RadioButton Command="Binding MyCommand" CommandParameter="Radio1"/>
<RadioButton Command="Binding MyCommand" CommandParameter="Radio2"/>
<RadioButton Command="Binding MyCommand" CommandParameter="Radio3"/>

在命令处理程序中,您可以根据收到的命令参数设置属性,而不是在转换器中进行。

【讨论】:

嗯好的。你能告诉我命令处理程序是什么样的吗?我从来没有使用过它们。而且,也许这可能是一个问题:我有几组 3 个单选按钮,并且“CommandState”属性在一个类中,在一个列表中这个类的列表......你明白我的问题吗?我将编辑我的帖子,以显示所有 xaml 代码。 我明白.. 这是单选按钮的常见问题.. 定义一个命令,这里是非常简单的方法wpftutorial.net/DelegateCommand.html 并使用它c-sharpcorner.com/Blogs/11800/… 感谢您提供两个链接。我认为它可以解决单选按钮问题,但现在,我的是:mainwindow.xaml.cs 中的某些属性由 mainwindow.xaml 使用。然后,如果我更改单选按钮的数据上下文,其他属性将不起作用... 为什么要改变单选按钮的DataContext..? 好吧,我实现了你的代码。但是我怎么知道哪个单选按钮被点击了?我有参数,好的,但我会有很多单选按钮。因为,我的 3 个单选按钮组正在根据列表创建...

以上是关于单选按钮、绑定、转换器的主要内容,如果未能解决你的问题,请参考以下文章

绑定变量 PyQt 单选按钮

将组 2 中的一个单选按钮的内容与组 1 中选定的单选按钮绑定

mvc 绑定/发布布尔到单选按钮

带单选按钮的角度动态 html 绑定

WinForm 绑定单选按钮

在 WinForms 中对一组单选按钮进行数据绑定的最佳方法