将WPF DataGrid ItemsSource绑定到自定义Table对象的方法IEnumerable <tablerow> GetRows()?</tablerow>

时间:2009-11-16 01:09:51

标签: c# .net wpf data-binding

我在WPF数据绑定的学习曲线上苦苦挣扎,可以使用一个例子。那些回答问题并链接到帮助他们“获得”WPF数据绑定的文章的奖励积分。

我正在尝试将自定义Table对象与WPF DataGrid绑定。

这是我的对象(我没有能力更改它们,签名被截断了一点):

public class MyTable
{
    public int ColumnCount { get; }
    public string GetColumnName(int columnIndex);
    public IEnumerable<MyTableRow> GetRows();
}

public class MyTableRow
{
    public MyTableCell [] Cells { get; }
}

public class MyTableCell
{
    public string Value { get; }
}

因此,当前DataContext上的WindowMyTable的实例。我看不到任何明确的方法从我的MyTable对象自动生成列,所以我在代码中生成了它们:

private void dg_Table_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    MyTable tbl = e.NewValue as MyTable;

    if (tbl != null)
    {
        //setup data grid columns
        dg_Table.Columns.Clear();

        for (int i = 0; i < tbl.ColumnCount; i++)
        {
            var column = new DataGridTextColumn()
            {
                Header = tbl.GetColumnName(i),
                Binding = new Binding(string.Format("Cells[{0}]", i))
            };

            dg_Table.Columns.Add(column);
        }
        //end setup data grid columns
    }
}

我认为下一步是将ItemsSource的{​​{1}}属性绑定到DataGrid对象上的GetRows方法,但我不知道如何去做。我想也许可以使用MyTable资源来完成,但我无法弄清楚如何在DataContext对象上引用方法。

有人可以帮我解决这个问题的XAML和代码吗?

2 个答案:

答案 0 :(得分:3)

AFAIK您无法绑定到特定实例的方法。您可以绑定到属性,或在XAML中创建的实例的方法,或静态方法,但不能绑定给定实例的方法。

请参阅Bind to a method in WPF

这是一些帮助我的绑定链接。

编辑:我意识到我应该尝试解决你当前的问题。 :P

首先,我对WPF中的DataGrid控件没有多少经验。话虽如此,当你绑定ItemsSource时它不会自动生成列吗?

我处理你的问题的方法是在MyTable对象周围创建一个包装器,并在包装​​器中实现一个调用GetRows方法的属性。将DataContext设置为包装器并将ItemsSource绑定到属性。

答案 1 :(得分:2)

使用值转换器索引Cells数组非常容易。转换器的参数是索引:

  ...
    var column = new DataGridTextColumn()
    {
      Header = tbl.GetColumnName(i),
      Binding = new Binding
      {
        Converter = CellAccessConverter.Instance,
        Parameter = i
      }
    }
  ...

这是转换器本身:

  private class CellAccessConverter : IValueConverter
  {
    public static readonly Instance = new CellAccessConverter();
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      return ((MyTableRow)value).Cells[(int)parameter];
    }
    object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }

享受!