【问题标题】:Does data binding support nested properties in Windows Forms?数据绑定是否支持 Windows 窗体中的嵌套属性?
【发布时间】:2012-02-12 05:25:33
【问题描述】:

我正在 Windows 窗体中编写测试应用程序。它有一个带有 TextBox 的简单表单,需要实现 DataBinding。我已经实现了 FormViewModel 类来保存我的数据,并为我的业务数据提供了 1 个类 — 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));
    }
}

视图模型:

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 属性时,没有任何变化。

但是当我使用它时效果很好:

TextBox.DataBindings.Add("Text", ViewModel.CurrentObject, "TestPropertyString");

所以我的问题是:数据绑定是否支持嵌套属性?

感谢您的解释!

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

    Databinding 行为在 .NET 4.0 中已更改。您的代码适用于 .NET 3.5。我在 Microsoft Connect 上发现了这个问题:.Net 4.0 simple binding issue

    这是对我有用的解决方法。使用BindingSource 作为数据对象:

    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" to my _ViewModel. You didn't post any code showing how you declared your ViewModel` 和 TestModel 对象的声明——也许那里有问题。
    • @MaksimGladkov 我不知道微软改变了数据绑定的实现。上面的代码在 VS2008 .NET 3.5 中工作,但是当我在 C# 2010 Express .NET 4.0 上测试它时,它没有工作。我收到Cannot bind to property... 错误。高飞。
    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多