Как передать данные в модель представления?

Я довольно долго создавал POC, пытаясь упростить примеры в многочисленных блогах. Почему-то я не вижу, чего мне не хватает.

У меня есть эта структура XAML, и я привязал содержимое текстового блока к свойству Alpha в модели представления.

<Window ... >
  <Window.DataContext>
    <local:ViewModel></local:ViewModel>
  </Window.DataContext>
  <Grid>
    ...
    <DataGrid ...>
      <DataGrid.Columns>
        <DataGridTemplateColumn>
          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <TextBlock Text="{Binding Alpha}"></TextBlock>
            </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
      </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Window>

Модель представления действительно проста и на данный момент состоит только из одного свойства.

class ViewModel
{
  public String Alpha { get; set; }
}

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

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();
  }

  private static IEnumerable<String> GetFakes()
  {
    yield return "beep";
    yield return "boop";
  }
}

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


person Konrad Viltersten    schedule 01.01.2015    source источник


Ответы (1)


У вас должна быть основная модель представления, которая содержит список ваших дочерних моделей представления.

class MainViewModel
{
    public ObservableCollection<DataGridRowViewModel> Items
    {
        get;
        set;
    }

    public MainViewModel(){
        Items = new ObservableCollection<DataGridRowViewModel>{
            new DataGridRowViewModel("Beep"),
            new DataGridRowViewModel("Meep")
        };
    }
}

class DataGridRowViewModel
{
    public string Alpha {get;set;}

    public DataGridRowViewModel(string alpha){
        Alpha = alpha;
    }
}

В вашей сетке данных вы должны выполнить привязку к свойству Items, см. ItemsSource.

<Window ... >
  <Window.DataContext>
    <local:MainViewModel/>
  </Window.DataContext>
  <Grid>
    ...
    <DataGrid ... ItemsSource="{Binding Items}">
      <DataGrid.Columns>
        <DataGridTemplateColumn>
          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <-- This DataTemplate applies TO DataGridRowViewModel -->
              <TextBlock Text="{Binding Alpha}"></TextBlock>
            </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
      </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Window>
person Erti-Chris Eelmaa    schedule 01.01.2015
comment
Давайте проверим, правильно ли я понял. Чтобы применить это к моему упрощенному примеру (поскольку ваш явно является частью большего творения), класс модели представления должен иметь метод, например. Загрузить(). В этом методе мы устанавливаем для свойства Alpha самого себя значение... что именно? Я думаю, что это точка застревания для меня. Я могу получить массив строк, но мне нужно каким-то образом передать эту информацию в модель представления. Но это требует разрезания массива на отдельные части. Где это соединение встречается в вашем примере (от T[] до T, T, T и т. д.) ? - person Konrad Viltersten; 01.01.2015
comment
@КонрадВилтерстен; Я обновил ответ. Посмотрим, будет ли в этом больше смысла. - person Erti-Chris Eelmaa; 01.01.2015