【问题标题】:WPF Radiobutton Group - binding to a booleanWPF Radiobutton Group - 绑定到布尔值
【发布时间】:2026-02-12 16:20:04
【问题描述】:

我有一个单选按钮组,我绑定到一个布尔值,但它没有在 XAML 中被拾取 - 我确信它很简单 - 任何指针都值得赞赏。

passed 设置为 false。

XAML

<RadioButton Width="64" 
      IsChecked="{Binding passed, Converter={StaticResource BoolInverterConverter}}" 
      GroupName="Result">Yes</RadioButton>
<RadioButton Width="64" 
      IsChecked="{Binding passed, Converter={StaticResource BoolInverterConverter}}" 
      GroupName="Result">No</RadioButton>

BoolInverterConverter:

public class BoolInverterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }

        return value;
    }
}

未填充:

视图模型:-

  public ResultsViewModel()
  {
   private Results_results = new Results();

   public ResultsViewModel()
   {
      _results.Passed= false;
   }
  }

结果类:-

    public class Results
    {
      private bool passed;

      public bool Passed{ get => passed; set => passed= value; }
    }

【问题讨论】:

  • 你能发布你的 ViewModel 吗?您还可以在调试时检查 Visual Studio 输出选项卡,它会告诉您是否找不到绑定。
  • @Seb - 添加了 ViewModel - 调试未显示绑定失败...
  • 删除您的一个转换器。大概是的。你把两者都颠倒了。这不可能。

标签: c# wpf data-binding binding ivalueconverter


【解决方案1】:
<RadioButton Width="64" IsChecked="{Binding Passed}" GroupName="T1" Style="{DynamicResource CaseSummaryOptions}">Yes</RadioButton>
<RadioButton Width="64" IsChecked="{Binding Passed, Converter={StaticResource InverseBoolRadioConverter}}" GroupName="T1">No</RadioButton>

【讨论】:

    【解决方案2】:

    您需要在更新视图模型字段时告知绑定。您可以通过实现 INotifyPropertyChanged 接口来实现。

    让我们为此创建一个基类:

    class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged ( [CallerMemberName] string propertyName = "" )
        {
            PropertyChanged?.Invoke ( this, new PropertyChangedEventArgs ( propertyName ) );
        }
    }
    

    那你这样用(没错Results也是s ViewModel):

    public class Results : ViewModelBase
    {
        private bool passed;
    
        public bool Passed
        {
            get { return passed; }
            set
            {
                passed = value;
                OnPropertyChanged ( );
            }
        }
    }
    

    【讨论】: