C# MVVM:将单选按钮绑定到布尔属性

3

我是一个新手程序员,目前正在学习C#和MVVM模式。

我需要为大学编写一个ChiliPlants数据库工具。在该工具中,您应该能够向ObservableCollection添加一个新对象。

要向此ObservableCollection添加新项,需要打开一个新窗口。它看起来像这样: 添加窗口

现在我想将两个单选框绑定到名为“HybridSeed”的属性上。该属性在ViewModel中定义:

//Public Property HybridSeed
    public bool HybridSeed
    {
        get { return ChiliModel.HybridSeed; }
        set
        {
            if (ChiliModel.HybridSeed == value)
                return;
            ChiliModel.HybridSeed = value;
            OnPropertyChanged("HybridSeed");
        }
    }

我的 View 中的 RadioBox 部分如下所示:
 <RadioButton Grid.Row="5" Content="Ja" Grid.Column="1" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
    <RadioButton Grid.Row="5" Content="Nein" Grid.Column="1" HorizontalAlignment="Left" Margin="89,10,0,0" VerticalAlignment="Top"/>

如何将用户单击这些 RadioButton 的结果与 HybridSeed 属性绑定?重要的是,结果是一个布尔值。

我查看了几乎所有与此主题类似的条目,但我没有找到简单的解决方案。或者有一种我能够用我的糟糕编码技能理解的解决方案 :( ...

如果您能帮助我,我会非常高兴。请对这个新手保持简单 :)

如果使用 CheckBox 或 ComboBox 有更简单的解决方案,那也很完美。最重要的是拥有一个漂亮的用户界面。现在它只能通过文本框工作,用户总是必须写"True"或"False"。

解决方案:

我添加了 "Yes" RadioButton 中的 IsClicked 属性,将其绑定到我的布尔属性上:IsClicked="{Binding HybridSeed}"。感谢 naslund 快速回答 :)

1个回答

7

只需将HybridSeed绑定到Yes单选按钮即可。如果用户选择了Yes,则为true;如果选择了No单选按钮(或者没有选择任何单选按钮),则为false。在这种情况下,绑定两个按钮有点冗余,因为单选按钮的机制会处理它。

WPF:

<RadioButton Content="Yes" IsChecked="{Binding HybridSeed}" />
<RadioButton Content="No" />
<Label Content="{Binding HybridSeed}" ContentStringFormat="Value is: {0}" />

逻辑:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
}

public class ViewModel : INotifyPropertyChanged
{
    private bool hybridSeed;

    public bool HybridSeed
    {
        get { return hybridSeed; }
        set
        {
            hybridSeed = value;
            OnPropertyChanged(nameof(HybridSeed));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

太好了!感谢您快速简单的回答 :) 现在我意识到,我的问题有点愚蠢,但是没有人天生就是编程天才,对吧? :) - ccdreyer
不,这是一个好问题。当我开始使用MVVM时,我经常忘记你可以将值绑定到基本上任何属性,但是当你掌握它时,它非常强大。 - naslund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接