我有一个数据网格,我绑定到自定义类型的ObservableCollection。该类型具有布尔属性“IsCopying”。 “绑定”是通过将网格的ItemSource属性指定给ObservableCollection来完成的。
我希望在数据绑定到网格之前更改数据。网格只需要是数据的只读视图。我已使用AutoGeneratingColumn事件更改了列标题:
if (e.Column.header.ToString() == "IsCopying")
{
DataGridTextColumn t = new DataGridTextColumn();
t.header = "Status";
e.Column = t;
}
......工作正常。我想在将每个属性绑定到每行的单元格时执行相同的操作。我的工作原理如下:
//NOT REAL CODE!!!!!!!
private void dgItem_CellBinding(object sender, DataGridCellBindingEventArgs e)
{
MyCustomType theItem = e.(MyCustomType)ObjectGettingBound;
if (theItem.IsCopying == true)
{
e.TypeGettingBound= DataGridCellType.Text //or however this works;
e.DataToBind = "Working...";
}else{
e.TypeGettingBound = DataGridCellType.Text;
e.DataToBind = "Waiting for command...";
}
}
希望以上是有道理的。我找不到单个单元格何时绑定以及如何拦截它的事件。我确信这是非常常见的,但我是新手,并且在SO上找不到解决这一特定问题的任何内容。也许我会以错误的方式去做?
答案 0 :(得分:0)
您的自定义类型是否实现了INotifyPropertyChange?
你可以在你的自定义类型中添加一个公共属性来引发PropertyChange事件并公开你需要的文本帽吗?
public class MyCustomType: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private bool _IsCopying;
public bool IsCopying
{
get { return _IsCopying; }
set
{
_IsCopying = value;
OnPropertyChanged("IsCopyingText");
}
}
public string IsCopyingText
{
get
{
if(IsCopying) return "Working...";
else return "Waiting for command...";
}
}
}
然后将列绑定到IsCopyingText属性,如果您不想显示IsCopying列,请在AutoGeneratingColumn事件(http://msdn.microsoft.com/en-us/library/cc903950(v=vs.95).aspx)中将其Cancel属性设置为True
使网格只读:http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.isreadonly.aspx
另一种方法是使用IValueConverter,如下所示: