【发布时间】:2020-10-27 02:57:13
【问题描述】:
有没有办法更改已经绑定到ViewModel 属性的RadioButton 的BackColor?
基本上我使用ViewModel 和INotifyPropertyChanged,我想根据绑定到的 Bool 属性更改单选按钮的BackColor。所以如果true 则设置背景色为Green 否则default。
这是我迄今为止的尝试,显然行不通。我很确定我的双重绑定不正确?
public class ViewModel : INotifyPropertyChanged
{
private bool _prop1;
public bool Prop1 {
get
{
return _prop1;
}
set
{
if (value == _prop1) return;
_prop1= value;
OnPropertyChanged();
OnPropertyChanged(nameof(BackColor));
}
}
private bool _prop2;
public bool Prop2{
get
{
return _prop2;
}
set
{
if (value == _prop2) return;
_prop2= value;
OnPropertyChanged();
OnPropertyChanged(nameof(BackColor));
}
}
public Color BackColor => Color.Green;
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
表格
public partial class Form1
{
private ViewModel _viewModel;
public Form1()
{
InitializeComponent();
SetupBindings();
}
public void SetupBindings()
{
radioButton1.DataBindings.Add("Checked", _viewModel, nameof(_viewModel.Prop1), true);
radioButton1.DataBindings.Add("BackColor", _viewModel, nameof(_viewModel.BackColor ), true, DataSourceUpdateMode.OnPropertyChanged);
radioButton2.DataBindings.Add("Checked", _viewModel, nameof(_viewModel.Prop2), true);
radioButton2.DataBindings.Add("BackColor", _viewModel, nameof(_viewModel.BackColor ), true, DataSourceUpdateMode.OnPropertyChanged);
}
}
【问题讨论】:
-
为什么不在你的虚拟机中声明一个
BackColor属性,将它绑定到你的单选按钮的背景颜色,当你的其他属性改变时适当地改变'BackColor`的值? -
@Sach 已在我的 VM 中声明
public Color BackColor => Color.Green; -
因此,将其绑定到单选按钮的背景属性,而不是绑定 Prop1 和 2,这正是您现在正在做的。然后,当 Prop1 和 2 发生变化时,相应地更改
BackColor属性。 -
同上。顺便说一句,您在通知更改后设置了值,不知道为什么当值是
true时才触发通知(您应该检查_prop1 != value) -
@Sach 抱歉,将我的代码复制到 SOF 编辑器时出现拼写错误。因此,对于每个单选按钮,我都绑定了
Prop1和Prop2以及BackColor属性。它是否正确?当我测试这两个按钮都是绿色的?
标签: c# winforms data-binding viewmodel inotifypropertychanged