可检查的业务对象到网格

我们都喜欢用WPF绑定是多么容易。 现在我回到了Winforms的工作,我正在寻找一种很好的方式来绑定我的网格到BusinessObjects的可检查列表(我坚持使用BindingList for Winforms)。 所以我基本上只是添加一个可检查的业务对象。

我正在使用网格,因为用户将编辑多列(在此业务对象的名称和描述中) - 以及向网格添加新对象并从中删除。 选中列表框不适合此目的,因为我想编辑列。

为此,我使用.NET 4。

我基本上想要减少场景中的UI代码量,所以我使用基于视图模型的方法来填充列表。 我希望用户能够检查每个业务对象属性旁边的框。

当然,我可以使用继承,但如果我想对许多业务对象应用相同的机制(有很多不同的屏幕,您检查不同业务对象列表中的项目)。 也许这将是一条走的路 - 但我有我的怀疑。

现在取决于网格的选择 - 我正在使用Infragistics - 功能将有望在概念上非常相似。

我考虑将业务对象包装在Checkable泛型类中:

using System;
using System.Collections.Generic;

public class Checkable<T> : ModelBase
{
    public Checkable(T value)
    {
        _value = value;
    }

    private T _value;
    public T Value
    {
        get
        {
            return _value;
        }
        set
        {
            if (!EqualityComparer<T>.Default.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }

    private bool _checked;
    public bool Checked
    {
        get { return _checked; }
        set 
        {
            if (_checked != value)
            {
                _checked = value;
                OnPropertyChanged("Checked");
            }
        }
    }

}

我已经为此场景构建了一个业务对象:

public class BusinessObject : ModelBase
{
    public BusinessObject()
    {
    }

    public BusinessObject(RepairType repairType)
    {
        _name = repairType.Name;
        _id = repairType.Id;
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set 
        {
            if (_name != value)
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

    private string _description;
    public string Description
    {
        get { return _description; }
        set 
        {
            if (description != value)
            {
                description = value;
                OnPropertyChanged("Description");
            }
        }
    }

    private int _id;
    public int Id
    {
        get { return _id; }
        set 
        {
            if (_id != value)
            {
                _id = value;
                OnPropertyChanged("Id");
            }
        }
    }
}

ModelBase只是实现了INotifyPropertyChanged:

public abstract class ModelBase : INotifyPropertyChanged, IDisposable
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    protected bool SetProperty<T>(ref T field, T value, string propertyName = null)
    {
        if (object.Equals(field, value)) { return false; }

        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            PropertyChanged = null;
        }
    }
}

因此,对于我的网格数据源,我可能会定义:

// in view model
var datasource = new BindingList<Checkable<BusinessObject>>();
... populate list


grid.DataSource = viewmodel.DataSource;

所以当然我的情况在一分钟内失败,因为Value是具有我想要绑定到的属性的BusinessObject引用,Checked是我也想绑定到的复选框的属性。

我正试着用一些想法来启动旧的灰色问题。 我不太喜欢编写代码来定义网格列。 但是,在设计时,Infragistics网格可以直接将数据绑定到BusinessObject。 可以添加一个未绑定的列(复选框用于我的方案)并手动处理项目的检查/取消选中(我可能必须执行此操作)。

我想知道是否我错过了Winform绑定的任何巧妙的技巧,因为他们在很多年前出现时错过了Linq和Entity Framework。

链接地址: http://www.djcxy.com/p/29185.html

上一篇: checkable business object to a Grid

下一篇: How to strongly type data binding in C# WinForms?