可检查的业务对象到网格
我们都喜欢用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