【问题标题】:Winforms INotifyPropertyChanged for radio button backColorWinforms INotifyPropertyChanged 用于单选按钮 backColor
【发布时间】:2020-10-27 02:57:13
【问题描述】:

有没有办法更改已经绑定到ViewModel 属性的RadioButtonBackColor

基本上我使用ViewModelINotifyPropertyChanged,我想根据绑定到的 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 编辑器时出现拼写错误。因此,对于每个单选按钮,我都绑定了 Prop1Prop2 以及 BackColor 属性。它是否正确?当我测试这两个按钮都是绿色的?

标签: c# winforms data-binding viewmodel inotifypropertychanged


【解决方案1】:

好吧,我想我已经解决了我的问题:)

因此为我的 ViewModel 中的每个单选按钮为 BackColor 创建了两个单独的属性

private bool _prop1;
public bool Prop1 {
    get
    {
        return _prop1;
    }
    set
    {
        if (value == _prop1) return;
    
        _prop1= value;
        OnPropertyChanged(); 
        OnPropertyChanged(nameof(Radio1ButtonBackColor));               
    } 
}

private bool _prop2;
public bool Prop2{ 
    get
    {
       return _prop2;
    }
    set
    {
       if (value == _prop2) return;
    
       _prop2= value;
       OnPropertyChanged(); 
       OnPropertyChanged(nameof(Radio2ButtonBackColor));   
    } 
}
public Color Radio1ButtonBackColor => Prop1? Color.Green : default;
public Color Radio2ButtonBackColor => Prop2? Color.Green : default;

并将它们绑定到单选按钮backColor 属性

public void SetupBindings()
{
     radioButton1.DataBindings.Add("Checked", _viewModel, nameof(_viewModel.Prop1), true);
     radioButton1.DataBindings.Add("BackColor", _viewModel, nameof(_viewModel.RadioButton1BackColor Radio1ButtonBackColor), true, DataSourceUpdateMode.OnPropertyChanged);
 
     radioButton2.DataBindings.Add("Checked", _viewModel, nameof(_viewModel.Prop2), true);
     radioButton2.DataBindings.Add("BackColor", _viewModel, nameof(_viewModel.RadioButton2BackColor), true, DataSourceUpdateMode.OnPropertyChanged);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2011-01-29
    相关资源
    最近更新 更多