C# 将(双向)字符串绑定到包含内容的两个单选按钮

C# 将(双向)字符串绑定到包含内容的两个单选按钮,c#,wpf,xaml,data-binding,two-way-binding,C#,Wpf,Xaml,Data Binding,Two Way Binding,我想将字符串值True或False双向绑定到两个单选按钮,内容分别为True和False 条件 当使用select True单选按钮时,字符串值应为True,反之亦然(对于False单选按钮)。 一次只有一个单选按钮可选择为真或假。 有一个字符串列表,单选按钮是DataTemplate的一部分。 XAML 视图模型 模型库 用户界面 我几乎尝试了我所知道的一切,也检查了不同论坛和其他材料上的大部分相关链接 我想要的只是基于列表中用户选择的值True或False 提前感谢。我假设您的意思是将双向布

我想将字符串值True或False双向绑定到两个单选按钮,内容分别为True和False

条件

当使用select True单选按钮时,字符串值应为True,反之亦然(对于False单选按钮)。 一次只有一个单选按钮可选择为真或假。 有一个字符串列表,单选按钮是DataTemplate的一部分。 XAML

视图模型

模型库

用户界面

我几乎尝试了我所知道的一切,也检查了不同论坛和其他材料上的大部分相关链接

我想要的只是基于列表中用户选择的值True或False


提前感谢。

我假设您的意思是将双向布尔值绑定到两个单选按钮,而不是将双向字符串绑定到两个单选按钮,因为值的数据类型为bool

首先,不要使用数据触发器;移除它们

相反,在false按钮的绑定上,添加一个对布尔值求反的转换器:

<RadioButton x:Name="rbFalse" Content="False" IsChecked="{Binding Value,Mode=TwoWay,Converter={StaticResource NegateConverter}}"/>

使用单选按钮或复选框不是更简单吗?@Clemens我只需要使用单选按钮。谢谢你的帮助。你的转换代码真的帮助了我。我只想要这个,但不是为了绳子。我修改了它。
public partial class MainWindow : Window
{
    MainViewModel viewModel;

    public MainWindow()
    {
        InitializeComponent();

        viewModel = new MainViewModel();

        this.DataContext = viewModel;
    }
}
public class MainViewModel : ModelBase
{
    private List<MainModel> values;
    public List<MainModel> Values
    {
        get
        {
            return values;
        }
        set
        {
            if (value != values)
            {
                values = value;
                OnPropertyChanged("Values");
            }
        }
    }

    public MainViewModel()
    {
        Values = new List<MainModel>();

        for (int i = 0; i < 10; i++)
        {
            if (i % 2 == 0)
                Values.Add(new MainModel() { Value = true });
            else
                Values.Add(new MainModel() { Value = false });
        }
    }
}
public class MainModel : ModelBase
{
    private bool strValue;
    public bool Value
    {
        get
        {
            return strValue;
        }
        set
        {
            if (value != strValue)
            {
                strValue = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
public abstract class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
}
<RadioButton x:Name="rbFalse" Content="False" IsChecked="{Binding Value,Mode=TwoWay,Converter={StaticResource NegateConverter}}"/>
<local:NegateConverter x:Key="NegateConverter"/>
/// <summary>
/// This converter negates a boolean value.
/// </summary>
[ValueConversion(typeof(bool), typeof(bool))]
public class NegateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool bValue = false;
        if (value is bool)
        {
            bValue = (bool)value;
        }
        return !bValue;
    }

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