C# 绑定";已启用";变量的控件属性
我在一些类似的帖子中发现了一个问题,但是,它们并不完全相同,我不太确定如何将其应用到我的场景中。它们可能与我的情况相同,也可能不同。所以,我在这里发布我自己的问题,希望我能得到我的具体场景的答案 基本上,我有一个窗口窗体和一组控件。我希望能够将它们的Enabled属性绑定到我设置的布尔变量,以便它们可以根据我的判断启用或禁用C# 绑定";已启用";变量的控件属性,c#,winforms,C#,Winforms,我在一些类似的帖子中发现了一个问题,但是,它们并不完全相同,我不太确定如何将其应用到我的场景中。它们可能与我的情况相同,也可能不同。所以,我在这里发布我自己的问题,希望我能得到我的具体场景的答案 基本上,我有一个窗口窗体和一组控件。我希望能够将它们的Enabled属性绑定到我设置的布尔变量,以便它们可以根据我的判断启用或禁用 public partial class MyUI : Form { private int _myID; public int myID {
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绑定到我的变量\u bEnable。变量将根据用户输入的一个字段而变化,如果数据库中存在该字段中的值,则将启用其他控件以供用户更新,否则将禁用这些控件
我在这里找到了
但是数据绑定到文本字段。如何摆脱EnableControls方法并将_bEnabled的值绑定到每个控件中的“Enabled”属性?查看MVVM(Model-View-ViewModel)模式,特别是它在Windows窗体中的实现。将它应用于WPF/Silverlight应用程序要容易得多,但您仍然可以在Windows窗体中使用它,而不会遇到太多麻烦
要直接解决您的问题,您需要做两件事:
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.
}
}
也许您可以尝试这种方法:在
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;
}
}
EnableControls()
{
例如(int i=1;iYou正在与应用程序的状态进行“角力”。这是设计应用程序时常见的问题。看看一些著名的设计模式,如MVP、MVC或MVVM。这很优雅,这也是我所缺少的。我将在MVVC中挖掘更多信息以了解更多信息,但您的答案已经让我开始……)非常感谢!我想我需要多读一些关于MVVM的书,这对我来说是新的。我还没有机会/奢侈地这么做,但我有一个关于你解释的快速跟进问题,我想“我理解”.因此,如果我理解正确,用法/启动应该在另一个名为Model的类中,并且可以安全地说,根据您上面的解释,视图不会“说话”直接发送到ViewModel,但只接收来自ViewModel的指令?现在,如果视图发生更改,View如何将更改传回ViewModel或Model?就像用户在文本框中键入内容一样?根据您要绑定到的Windows窗体控件的哪个属性,可能会进行双向绑定。双向绑定是t两端的帽子更改会被传达(就像文本框值被输入到它绑定到的视图模型的属性中一样)你读过了吗?它有点像标准Windows窗体开发的范式转换,但它有很多原因,谢谢。链接我会看一下。它看起来像C++的文档视图模式。这很好。