我遇到了一些我在一些类似帖子上发现的问题,然而,它们并不完全相同,我不太确定如何将它应用到我的场景中。它们可能与我的情况相同或不同。所以,我希望在这里发布我自己的问题,我将得到我的具体情况的答案。
基本上,我有一个带有一堆控件的窗口表单。我希望能够将其Enabled属性绑定到我设置的布尔变量,以便可以根据我的判断启用或禁用它们。
public partial class MyUI : Form
{
private int _myID;
public int myID
{
get
{
return _myID;;
}
set
{
if (value!=null)
{
_bEnable = true;
}
}
}
private bool _bEnable = false;
public bool isEnabled
{
get { return _bEnable; }
set { _bEnable = value; }
}
public myUI()
{
InitializeComponent();
}
public void EnableControls()
{
if (_bEnable)
{
ctl1.Enabled = true;
ctl2.Enabled = true;
......
ctl5.Enabled = true;
}
else
{
ctl1.Enabled = false;
ctl2.Enabled = false;
......
ctl5.Enabled = false;
}
}
}
}
上面的EnableControls方法可以满足我的需要,但它可能不是最好的方法。我更喜欢将ctrl1..5绑定到我的变量_bEnable。变量将根据用户输入的一个字段而变化,如果字段中的值存在于数据库中,则将启用其他控件以供用户更新,否则将禁用它们。
我在这里找到了a very similar question 但数据绑定到文本字段。如何摆脱EnableControls方法并将_bEnabled的值绑定到每个控件中的“Enabled”属性?
答案 0 :(得分:8)
进入MVVM(Model - View - ViewModel)模式,特别是它在Windows Forms中的实现。将它应用到WPF / Silverlight应用程序要容易得多,但你仍然可以在Windows Forms中使用它而不会有太多麻烦。
要直接解决问题,您需要做两件事:
INotifyPropertyChanged
。这将是MVVM模式中的View Model。完成上面的1和2后,您可以更改类的状态(即更改表示按钮是否启用的属性,从true更改为false),表单将自动更新以显示此更改。< / p>
下面的代码应该足以使概念有效。你需要明显扩展它,但它应该足以让你开始。
查看模型
public class ViewModel : INotifyPropertyChanged
{
private bool _isDoStuffButtonEnabled;
public bool IsDoStuffButtonEnabled
{
get
{
return _isDoStuffButtonEnabled;
}
set
{
if (_isDoStuffButtonEnabled == value) return;
_isDoStuffButtonEnabled = value;
RaisePropertyChanged("IsDoStuffButtonEnabled");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
查看强>
public class View : Form
{
public Button DoStuffButton { get; set; }
public void Bind(ViewModel vm)
{
DoStuffButton.DataBindings.Add("Enabled", vm, "IsDoStuffButtonEnabled");
}
}
<强>用法强>
public class Startup
{
public ViewModel ViewModel { get; set; }
public View View { get; set; }
public void Startup()
{
ViewModel = new ViewModel();
View = new View();
View.Bind(ViewModel);
View.Show();
ViewModel.IsDoStuffButtonEnabled = true;
// Button becomes enabled on form.
// ... other stuff here.
}
}
答案 1 :(得分:0)
也许你可以尝试这种方法:在你的isEnabled
属性的setter方法中,添加一个if语句:
if(_bEnable) EnableControls();
else DisableControls();
如果您的控件名称是ctl1,ctl2 ......等,您可以尝试:
EnableControls()
{
for(int i=1; i<6;i++)
{
string controlName = "ctl" + i;
this.Controls[controlName].Enabled = true;
}
}
在DisableControls
如果将来有更多控件,这可能会更优雅。