Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据绑定是否支持Windows窗体中的嵌套属性?_C#_Winforms_Data Binding - Fatal编程技术网

C# 数据绑定是否支持Windows窗体中的嵌套属性?

C# 数据绑定是否支持Windows窗体中的嵌套属性?,c#,winforms,data-binding,C#,Winforms,Data Binding,我正在用Windows窗体编写测试应用程序。它有一个带有文本框的简单表单,需要实现数据绑定。我实现了FormViewModel类来保存我的数据,并为我的业务数据创建了一个类-TestObject 业务数据对象: public class TestObject : INotifyPropertyChanged { private string _testPropertyString; public string TestPropertyString { ge

我正在用Windows窗体编写测试应用程序。它有一个带有文本框的简单表单,需要实现数据绑定。我实现了FormViewModel类来保存我的数据,并为我的业务数据创建了一个类-TestObject

业务数据对象:

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上测试它时,它不起作用。我得到一个
无法绑定到属性…
错误。高飞。