C# 数据绑定是否支持Windows窗体中的嵌套属性?
我正在用Windows窗体编写测试应用程序。它有一个带有文本框的简单表单,需要实现数据绑定。我实现了FormViewModel类来保存我的数据,并为我的业务数据创建了一个类-TestObject 业务数据对象:C# 数据绑定是否支持Windows窗体中的嵌套属性?,c#,winforms,data-binding,C#,Winforms,Data Binding,我正在用Windows窗体编写测试应用程序。它有一个带有文本框的简单表单,需要实现数据绑定。我实现了FormViewModel类来保存我的数据,并为我的业务数据创建了一个类-TestObject 业务数据对象: public class TestObject : INotifyPropertyChanged { private string _testPropertyString; public string TestPropertyString { ge
public class TestObject : INotifyPropertyChanged
{
private string _testPropertyString;
public string TestPropertyString
{
get
{
return _testPropertyString;
}
set
{
if (_testPropertyString != value)
{
_testPropertyString = value;
RaisePropertyChanged("TestPropertyString");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
BindingSource bs = new BindingSource(_viewModel, null);
//textBox1.DataBindings.Add("Text", _viewModel, "CurrentObject.TestPropertyString");
textBox1.DataBindings.Add("Text", bs, "CurrentObject.TestPropertyString");
视图模型:
public class FormViewModel : INotifyPropertyChanged
{
private TestObject _currentObject;
public TestObject CurrentObject
{
get { return _currentObject; }
set
{
if (_currentObject != value)
{
_currentObject = value;
RaisePropertyChanged("CurrentObject");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
财产:
private FormViewModel _viewModel;
public FormViewModel ViewModel
{
get
{
if (_viewModel == null)
_viewModel = new FormViewModel();
return _viewModel;
}
}
因此,现在我尝试将数据绑定到文本框,如下所示:
TextBox.DataBindings.Add("Text", ViewModel, "CurrentObject.TestPropertyString");
令人惊讶的是,它不起作用!当我更改CurrentObject或更改TestPropertyString属性时,没有任何更改
但当我使用:
TextBox.DataBindings.Add("Text", ViewModel.CurrentObject, "TestPropertyString");
所以我的问题是:数据绑定支持嵌套属性吗?
谢谢你的解释 在.NET4.0中,
数据绑定行为发生了变化。您的代码在.NET3.5上运行。我在Microsoft Connect上发现此问题:
这就是对我有用的工作。使用BindingSource
作为数据对象:
public class TestObject : INotifyPropertyChanged
{
private string _testPropertyString;
public string TestPropertyString
{
get
{
return _testPropertyString;
}
set
{
if (_testPropertyString != value)
{
_testPropertyString = value;
RaisePropertyChanged("TestPropertyString");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
BindingSource bs = new BindingSource(_viewModel, null);
//textBox1.DataBindings.Add("Text", _viewModel, "CurrentObject.TestPropertyString");
textBox1.DataBindings.Add("Text", bs, "CurrentObject.TestPropertyString");
所以我将不能以这样的方式使用它:“CurrentObject.TestPropertyString”?WinForms中我的代码的替代方案是什么?@MaksimGladkov我用工作代码更新了答案。也许你没有申报财产。奇怪,但这对我不起作用。反正什么也没发生。@MaksimGladkov我照样复制了你的代码。我唯一更改的是来自ViewModel的声明“到我的
\u视图模型。您没有发布任何代码来显示如何声明您的
ViewModel`和
TestModel对象-可能有问题。@MaksimGladkov我不知道Microsoft更改了数据绑定实现。上面的代码可以在VS2008.NET3.5中使用,但是当我在C#2010Express.NET4.0上测试它时,它不起作用。我得到一个无法绑定到属性…
错误。高飞。