Кажется, я не могу получить WPF DataBinding в моей голове - PullRequest
4 голосов
/ 21 марта 2011

Хорошо, я не новичок в программировании или C # как таковой, я просто не могу понять, что привязка данных WPF прямо в моей голове. Мои коллеги бредят по этому поводу (и да, я их тоже спрошу), но сейчас я в замешательстве.

Вот что я хотел бы сделать для начала:

В качестве примера у меня есть список вещей , например:

List<Thing> thingList = Source.getList();

Теперь обычно я бы пошел

foreach(Thing t in thingList)
{
    //add thing to combobox
}

Но из того, что я могу понять, я могу как-то не делать этого, а использовать привязку данных для заполнения поля со списком для меня.

То, что я не могу получить, это , где мне поместить 'thingList'? Я делаю это отдельным имуществом где-нибудь? Куда мне положить это свойство?

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

Кто-нибудь готов помочь мне или указать на какое-то пошаговое руководство, которое я мог пропустить?

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

Используйте ObservableCollection<T> для привязки данных в WPF. Где Т ваш класс. Смотрите пример ниже

public class NameList : ObservableCollection<PersonName>
{
    public NameList() : base()
    {
        Add(new PersonName("A", "E"));
        Add(new PersonName("B", "F"));
        Add(new PersonName("C", "G"));
        Add(new PersonName("D", "H"));
    }
  }

  public class PersonName
  {
      private string firstName;
      private string lastName;

      public PersonName(string first, string last)
      {
          this.firstName = first;
          this.lastName = last;
      }

      public string FirstName
      {
          get { return firstName; }
          set { firstName = value; }
      }

      public string LastName
      {
          get { return lastName; }
          set { lastName = value; }
      }
  }

Теперь в XAML. Перейти к тегу ресурса

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:c="clr-namespace:SDKSample"

  x:Class="Sample.Window1"
  Width="400"
  Height="280"
  Title="MultiBinding Sample">

  <Window.Resources>
    <c:NameList x:Key="NameListData"/>
  </Window.Resources>


<ListBox Width="200"
         ItemsSource="{Binding Source={StaticResource NameListData}}"  // Name list data is declared in resource
         ItemTemplate="{StaticResource NameItemTemplate}"
         IsSynchronizedWithCurrentItem="True"/>

xmnls:c даст вам возможность выбрать класс. Здесь вы можете выбрать c, d, e x что угодно, но убедитесь, что оно должно использоваться раньше

1 голос
/ 22 марта 2011

Когда дело доходит до привязки данных, я обнаружил, что эта страница если внимательно прочитать ответы на большинство вопросов, возникающих у новичков.

Чтобы ответить на вопрос: оповещение о добавлении всех элементов заключается в том, чтобы сообщить ComboBox, где взять его элементы, это делается с помощью свойства ItemsSource.

Вы можете установить это либо в XAML, либо в коде, в то время как вам потребуется выражение для привязки в XAML, которое обычное назначение должно выполнять в коде:

comboBox.ItemsSource = thingList;

Если вы не укажете далее, как должны отображаться эти объекты в списке, будет вызван метод ToString, если он не будет переопределен, вы, как правило, получите путь к классу вашего объекта. Существует два основных способа сообщить приложению, как отображать объект:

Первый и более тяжелый вариант - Шаблоны данных , который используется для отображения сложных данных с использованием элементов управления (которые, в свою очередь, могут содержать элементы, шаблоны и т. Д.), Второй способ - использование облегченных свойств, таких как DisplayMemberPath, в котором должно быть указано имя свойства, которое должно отображаться (обычно просто строка).

Если ваш список изменяется и поле со списком должно обновляться само по себе, источник должен реализовать INotifyCollectionChanged, в большинстве случаев вы будете использовать стандартную реализацию ObersableCollection<T>.

0 голосов
/ 22 марта 2011

Большинство людей используют WPF Databinding для заполнения поля со списком, но это не обязательно.

Вы можете добавить элементы по коду, если хотите.

Легко поймать себя в ловушку, делая все как нужно, без веской причины для этого (кстати, я не рекомендую вам добавлять элементы вручную, я просто говорю, что вы можете) .

List<Thing> thingList = Source.getList();

foreach(Thing t in thingList)
{
   combobox.Items.Add( t );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...