将(TwoWay)字符串绑定到具有内容的两个单选按钮

时间:2018-07-17 06:18:14

标签: c# wpf xaml data-binding two-way-binding

我想将一个字符串值(“ True”或“ False”)绑定(双向)到具有“ True”和“ False”内容的两个单选按钮。

条件

  1. 使用“ True”单选按钮时,字符串值应为“ True”,对于“ False”单选按钮则相反。
  2. 一次只能选择一个RadioButton,否则为True或False。
  3. 有字符串列表,单选按钮是DataTemplate的一部分。

XAML

<Grid.RowDefinitions>
    <RowDefinition Height="*"/>
    <RowDefinition Height="Auto"/>
</Grid.RowDefinitions>

<ListBox ItemsSource="{Binding Values}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <RadioButton x:Name="rbTrue" Content="True" IsChecked="{Binding Value,Mode=TwoWay}" />
                <RadioButton x:Name="rbFalse" Content="False" IsChecked="{Binding Value,Mode=TwoWay}"/>
            </StackPanel>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=Value,Mode=TwoWay}" Value="True">
                <Setter Property="IsChecked" TargetName="rbTrue" Value="True"/>
                <Setter Property="IsChecked" TargetName="rbFalse" Value="False"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=Value,Mode=TwoWay}" Value="False">
                <Setter Property="IsChecked" TargetName="rbTrue" Value="False"/>
                <Setter Property="IsChecked" TargetName="rbFalse" Value="True"/>
            </DataTrigger>
        </DataTemplate.Triggers>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

XAML.CS

public partial class MainWindow : Window
{
    MainViewModel viewModel;

    public MainWindow()
    {
        InitializeComponent();

        viewModel = new MainViewModel();

        this.DataContext = viewModel;
    }
}

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");
            }
        }
    }
}

MODELBASE

public abstract class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
}

UI

enter image description here

我几乎尝试了我所知道的一切,并且还在不同的论坛和其他材料上在线检查了大多数相对链接。

根据列表中的用户选择,我想要的只是“ True”或“ False”值。

谢谢。

1 个答案:

答案 0 :(得分:1)

我假设您的意思是“将(TwoWay) Boolean 值绑定到两个单选按钮”,而不是“将(TwoWay) string 绑定到两个单选按钮”,因为{ {1}}的数据类型为Value

首先,不要使用bool;删除它们。

相反,在“假”按钮的绑定上,添加一个否定布尔值的转换器:

DataTrigger

在XAML资源中,您需要定义转换器:

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

用您在其中定义<local:NegateConverter x:Key="NegateConverter"/> 类的任何命名空间替换local

这是转换器的代码:

NegateConverter