在wpf中为数据网格指定itemssource时更改数据

时间:2014-06-03 14:23:10

标签: c# wpf datagrid

我有一个数据网格,我绑定到自定义类型的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上找不到解决这一特定问题的任何内容。也许我会以错误的方式去做?

1 个答案:

答案 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,如下所示:

WPF Datagrid - Column Binding related to other columns