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>
答案 0 :(得分:2)
回答一些问题:
ViewModels中有多少/哪些?
你当然应该有一个MainViewModel。然后那个MainViewModel有
PeopleListViewModel
和PlacesListViewModel
或ObservableCollection<PersonViewModel>
和ObservableCollection<PlaceViewModel>
。是的,您可以拥有任意数量,但称其为ItemsA和ItemsB不是最佳选择。在第一个选项中,创建2个视图(UserControls)来保存列表。
在第二个选项中,您可以使用ItemsControl和DataTemplate来显示列表。
一般来说,在MVVM中尽量避免使用SelectedItemChanged和其他事件。您可以将(视图的一部分)数据绑定到SelectedItem属性。