Нетривиальная привязка данных - PullRequest
0 голосов
/ 10 октября 2008

Тривиальные примеры привязки данных являются просто тривиальными. Я хочу сделать что-то немного более сложное, и мне интересно, есть ли простой, встроенный способ справиться с этим.

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    List<DataStruct> list = new List<DataStruct>()
    {
      new DataStruct(){Name = "Name 1", Value = "Value 1", ComplexValue = new ComplexValue(){Part1 = "1:P1", Part2 = "1:P2"}},
      new DataStruct(){Name = "Name 2", Value = "Value 2", ComplexValue = new ComplexValue(){Part1 = "2:P1", Part2 = "2:P2"}}
    };

    listBox1.DataSource = list;
    listBox1.DisplayMember = "ComplexValue.Part1";
  }
}

public class DataStruct
{
  public string Name { get; set; }
  public string Value { get; set; }
  public ComplexValue ComplexValue { get; set; }
}

public class ComplexValue
{
  public string Part1 { get; set; }
  public string Part2 { get; set; }
}

Есть ли простой способ получить значение свойства Part1, которое будет задано в качестве отображаемого элемента для списка элементов DataStruct? Выше я попробовал что-то, что, по моему мнению, имело смысл, но по умолчанию оно возвращается к ToString () в DataStruct. Я могу обойти это в случае необходимости, мне просто интересно, есть ли что-то встроенное в привязку данных, которое бы обрабатывало более сложную привязку данных, как описано выше.

Редактировать: Использование WinForms

Ответы [ 2 ]

2 голосов
/ 11 октября 2008

Лично я бы пошел на простое решение, такое как Джимми - однако, если вы хотите сделать это (с обычными привязками win-формы), вам нужно использовать дескриптор пользовательского типа, чтобы сгладить Part1 / Part2 как виртуальные свойства DataStruct. Вы можете сделать это через ICustomTypeDescriptor или TypeDescriptionProvider. Последний является более сложным, но более чистым с точки зрения «разделения интересов».

Если вы действительно хотите, я могу подготовить пример (или есть много, что я сделал в прошлом, плавающих вокруг) - но просто прекрасно, если у вас есть только несколько свойств, простой фасад (то есть свойства pass-thru) на DataStruct) будет предпочтительнее.

2 голосов
/ 11 октября 2008

возможно не встроенный способ, но вы всегда можете определить

DataStruct {
    public ComplexValuePart1 { 
        get { return ComplexValue.Part1; }
    }
}

и установите для вашего DisplayMember значение

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