问题描述
我正在Windows Forms中编写测试应用程序。它具有TextBox的简单形式,需要实现DataBinding。我已经实现了FormViewModel类来保存我的数据,并为我的业务数据 - TestObject提供了1个类。业务数据对象:
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));
}
}
ViewModel:
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如下:
TextBox.DataBindings.Add(Text,ViewModel,CurrentObject.TestPropertyString);
令人惊讶的是,它不起作用!没有任何变化,当我更改CurrentObject或更改TestPropertyString属性。
但是,当我使用:
pre> TextBox.DataBindings.Add(Text,ViewModel.CurrentObject,TestPropertyString);
所以我的问题是:数据绑定支持嵌套属性?
感谢您的解释!
.NET 4.0中的数据绑定
行为已更改。您的代码适用于.NET 3.5。我发现这个问题发布在Microsoft Connect:
这是为我工作的解决方案。使用 BindingSource
作为数据对象:
BindingSource bs = new BindingSource (_viewModel,null);
//textBox1.DataBindings.Add(\"Text,_viewModel,CurrentObject.TestPropertyString);
textBox1.DataBindings.Add(Text,bs,CurrentObject.TestPropertyString);
I am writing the test application in Windows Forms. It has a simple form with TextBox and needs to implement DataBinding. I have implemented the class FormViewModel to hold my data, and have 1 class for my business data — TestObject.
Business Data object:
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));
}
}
ViewModel:
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));
}
}
Property:
private FormViewModel _viewModel;
public FormViewModel ViewModel
{
get
{
if (_viewModel == null)
_viewModel = new FormViewModel();
return _viewModel;
}
}
So now I'm trying to bind my data to TextBox like this:
TextBox.DataBindings.Add("Text", ViewModel, "CurrentObject.TestPropertyString");
And surprisingly, it doesn't work! Nothing changes, when I change CurrentObject, or change TestPropertyString property.
But it works great, when I use:
TextBox.DataBindings.Add("Text", ViewModel.CurrentObject, "TestPropertyString");
So my question is: Does data binding support nested properties?
Thank you for explanations!
The Databinding
behavior was changed in .NET 4.0. Your code works on .NET 3.5. I found this issue posted at Microsoft Connect: .Net 4.0 simple binding issue
Here was the work-around that worked for me. Use a BindingSource
as the data object:
BindingSource bs = new BindingSource(_viewModel, null);
//textBox1.DataBindings.Add("Text", _viewModel, "CurrentObject.TestPropertyString");
textBox1.DataBindings.Add("Text", bs, "CurrentObject.TestPropertyString");
这篇关于数据绑定是否支持Windows窗体中的嵌套属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!