Привязать WPF DataGrid ItemsSource к методу IEnumerable <TableRow>GetRows () пользовательского объекта Table? - PullRequest
2 голосов
/ 16 ноября 2009

Я борюсь с кривой обучения привязке данных 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 на текущем Window является экземпляром MyTable. Я не мог найти какой-либо четкий способ автоматического создания столбцов из моего 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 DataGrid к методу GetRows объекта MyTable, но я не уверен, как это сделать. Я подумал, что это может быть сделано с использованием ресурса ObjectDataProvider, но я не могу понять, как ссылаться на метод в объекте DataContext.

Может ли кто-нибудь помочь мне с XAML и кодом для этого сценария?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2009

AFAIK, вы не можете привязать метод определенного экземпляра. Вы можете связать свойство, или метод экземпляра, созданного в XAML, или статический метод, но не метод данного экземпляра.

См. Привязка к методу в WPF .

Вот несколько обязательных ссылок, которые мне помогли.

РЕДАКТИРОВАТЬ: Я понял, что, вероятно, я должен попытаться решить вашу текущую проблему тоже. : P

Во-первых, у меня нет большого опыта работы с элементом управления DataGrid в WPF. Сказав это, разве он не генерирует автоматически столбцы, когда вы связываете ItemsSource?

Я бы решил вашу проблему, создав оболочку вокруг объекта MyTable, а в оболочке реализовав свойство, которое вызывает метод GetRows. Установите DataContext для оболочки и привяжите ItemsSource к свойству.

2 голосов
/ 16 ноября 2009

Очень просто использовать преобразователь значений для индексации массива 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();
    }
  }

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...