MVVM - 单页上的绑定列表/如何设置MainView和ItemView模型并设置数据绑定

时间:2011-01-30 14:01:35

标签: silverlight visual-studio-2010 windows-phone-7

Windows Phone的MVVM问题

假设您希望在View模型中拥有多个列表,并在每个Panel中说出一个带有不同ListBox的Pivot表单。为了便于说明,我们假设我们在一个页面中有两个人员和地点的列表框,但在不同的面板上。 (PeopleList和PlacesList)

如何设置ViewModel。每个列表都有一个MainViewModel吗?一个MainViewModel有两个列表?我希望能够根据他们的选择导航到相应的详细页面详细信息页面。

其次,如何在加载表单时将每个列表框绑定到不同的viewmodel。

我的困惑是,示例似乎表明,在加载表单时,您将上下文设置为单个“静态变量”,并且不确定如何指定每个列表框的不同来源。

下面是一些示例代码片段......有问题???

   DataContext = App.ViewModel ;


    public class MainViewModel : INotifyPropertyChanged
    {
        public MainViewModel()
        {
            this.Items = new ObservableCollection<ItemViewModel>();
//?? can you have more than one of these?
        }

//?? should I have Public MainViewModel2() with this.Items = new OC<IVM2>
//...

/// Creates and adds a few ItemViewModel objects into the Items collection.
        /// </summary>
        public void LoadData()
        {
            this.Items.Add(new ItemViewModel() { VAR1 = "X", VAR2 = "Y"}) ;

<Grid x:Name="LayoutRoot" Background="Transparent" >
          <!--Pivot Control-->
        <controls:Pivot x:Name="Pivot" Title="MyApp" DataContext="{Binding}" Loaded="Pivot_Loaded">
            <!--Pivot item one-->

...

  <!--Pivot item two-->
            <controls:PivotItem Header="people">

                <Grid>
                    <ListBox x:Name="PeopleList" Height="442" HorizontalAlignment="Left" Margin="46,68,0,0"  VerticalAlignment="Top" Width="346" ItemsSource="{Binding ItemsA}" SelectionChanged="ListBox1_SelectionChanged" />
                </Grid>

<!--Pivot item three-->
            <controls:PivotItem Header="places">

                <Grid>
                    <ListBox x:Name="PlacesList" Height="442" HorizontalAlignment="Left" Margin="46,68,0,0"  VerticalAlignment="Top" Width="346" ItemsSource="{Binding ItemsB}" SelectionChanged="ListBox2_SelectionChanged" />
            </Grid>

1 个答案:

答案 0 :(得分:2)

回答一些问题:

  

ViewModels中有多少/哪些?

你当然应该有一个MainViewModel。然后那个MainViewModel有

  • 类型PeopleListViewModelPlacesListViewModel
  • 的两个属性
  • 两个列表属性ObservableCollection<PersonViewModel>ObservableCollection<PlaceViewModel>。是的,您可以拥有任意数量,但称其为ItemsA和ItemsB不是最佳选择。

在第一个选项中,创建2个视图(UserControls)来保存列表。

在第二个选项中,您可以使用ItemsControl和DataTemplate来显示列表。

一般来说,在MVVM中尽量避免使用SelectedItemChanged和其他事件。您可以将(视图的一部分)数据绑定到SelectedItem属性。