如何将数据提供给视图模型?

时间:2015-01-01 14:16:17

标签: c# wpf xaml gridview mvvm

我在创建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; }
}

当然,我们需要以某种方式将数据提供给视图模型。所以我为假值创建了一个简单的getter。

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

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

我还没有找到任何关于如何提供此数据到视图模型的明确示例(或者如何使视图模型获取数据)。请注意,要显示的数据是静态的,并且不会在第一时间发生变化,所以我不需要任何通知器(或者我会吗?)因为所有信息都已准备好进行初始化。

1 个答案:

答案 0 :(得分:0)

你应该有主视图模型,它包含你的子视图模型的列表。

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>