Как да подадете данните към модела на изгледа?

Създавам 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
Нека проверим дали съм разбрал правилно. За да приложа това в моя опростен пример (тъй като вашият очевидно е част от по-голямо творение), класът на модела на изглед трябва да има метод, напр. LoadStuff(). В този метод задаваме свойството Alpha на самото себе си на... какво точно? Мисля, че това е пречка за мен. Мога да получа масив от низове, но трябва по някакъв начин да предам тази информация на модела на изглед. Но това изисква нарязване на масива на отделни части. Къде се среща тази връзка във вашия пример (от T[] към T, T, T и т.н.) ? - person Konrad Viltersten; 01.01.2015
comment
@KonradViltersten; Актуализирах отговора. Вижте дали това има повече смисъл. - person Erti-Chris Eelmaa; 01.01.2015