将集合绑定到列表控件

时间:2012-11-08 05:01:14

标签: c# xaml mvvm windows-8 winrt-xaml

您好我正在学习MVVM和Win8应用程序开发,并且我无法通过XAML将ObservableCollection(位于NoteViewModel.cs中)绑定到我的MainPage列表框(或listview)。

public ObservableCollection<Note> NotesList;

Model是一个简单的Note.cs类,它包含NoteText,Priority和RemindDate。

我现在正在做的是在MainPage.xaml.cs的代码隐藏文件中设置DataContext 到ObservableCollection。

public MainPage()
{
    this.InitializeComponent();
    NoteViewModel nvm = new NoteViewModel();
    noteListView.DataContext = nvm.NotesList;
}

在NoteViewModel构造函数中,我只创建了2个新的Notes,然后将其添加到Collection中。

我想要做的是将XAML中的DataContext设置为NoteViewModel,将ItemsSource设置为NotesList。我想稍后将一个DetailsView实现为单个注释。

有许多教程将绑定集合添加到列表框中, 但我没有找到一个显示MVVM正确方法的方法。

任何帮助?

3 个答案:

答案 0 :(得分:3)

您需要将View(MainPage)绑定到ViewModel,而不是将列表的DataContext设置为集合

然后在视图的xaml中,将列表的ItemSource绑定到ViewModels NotesList属性

E.G。

视图模型:

public NoteViewModel : INotifyPropertyChanged
{
  //Collection must be a property
  public ObservableCollection<Note> NotesList {get; private set;}

  public NoteViewModel()
  {
     //Initialize your collection in the constructor
     NotesList = new ObservableCollection<Note>()
  }

  //.
  //.
  //.

}

如果您愿意,仍然可以在代码中设置DataContext

public MainPage()
{
  this.InitializeComponent();
  NoteViewModel nvm = new NoteViewModel();
  this.DataContext = nvm;
}

或者,您可以通过View的xaml设置DataContext。假设您的ViewModel位于名称空间MyProject:

添加对命名空间的引用

<UserControl x:class=MyProject.MainPage
  xmlns:local="clr-namespace:MyProject"
  .
  .
>

将ViewModel添加为资源

<UserControl.Resources>
  <local:NoteViewModel x:Key="NoteViewModel"/>
</UserControl.Resources>

将主容器的DataContext绑定到此资源

<Grid x:Name="LayoutRoot" DataContext="{StaticResource NoteViewModel}">

设置DataContext之后,需要通过绑定为notesListView控件设置ItemSource

ItemSource={Binding NotesList}

答案 1 :(得分:1)

对于简单的测试用例场景,请尝试以下方法:

创建ViewModel:

 // Create a property as an ObservableCollection<YourType> LstItemName in your ViewModel
 // On your ViewModel constructor, create a new LstItemName instance.
 // Create a property as "YourType" ItemName to bind to the selected Item of your List

创建视图:

 // Create a property of your ViewModel (codeBehind)
 // On your Views Constructor, create a new ViewModel instance. (codeBehind)
 // On loaded event of your View set the DataContext = ViewModel (codeBehind)

在您的列表中的XAML上:

<List     
ItemSource={Binding LstItemName}
SelectedItem={Binding ItemName}
/>

请记住使用ViewModel添加列表项。

答案 2 :(得分:0)

对于非常轻松的mvvm尝试学习一些强制它的库,我使用caliburn micro。它易于设置并提供许多非常有用的组件。