0

我正在使用MVVM和Silverlight 5.我想要實現的是在一個視圖中選擇ListBox中的項目(例如ListView.xaml)並顯示在另一個視圖中選擇ListBox中的項目(例如SelectionView.xaml)。將多個視圖綁定到ObservableCollection的選定項目(MVVM,SL5)

我選擇的項目是在ObservableCollection<MyItem>(稱爲SelectedItems)所描述的in this answer

的問題似乎是,我使用兩種不同的XAML文件通過附加的行爲產生。如果我在發生選擇的同一個XAML文件中綁定ListBoxSelectedItems,則這些項目在另一個ListBox中顯示在同一視圖中,沒有問題。但在另一個文件中,ListBox保持空白。

這兩個視圖都使用與DataContext相同的ViewModel

我會很高興的指出正確的方向。我是SL新手,所以也許我錯過了一些明顯的東西。

這是工作的代碼:

ListView.xaml

<UserControl x:Class="Silverlight5App.View.Content.ListView" 
    xmlns:viewModel="clr-namespace:Silverlight5App.ViewModel" 
    xmlns:behaviours="clr-namespace:Silverlight5App.Behaviours"> 


    <UserControl.Resources> 
     <viewModel:XYPlotViewModel x:Key="ViewModelTest" /> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource ViewModelTest}}"> 
     <StackPanel>    
      <ListBox ItemsSource="{Binding Path=XYPoints}" behaviours:SelectedItems.Items="{Binding SelectedItems}" Name="XYPointsListbox" SelectionMode="Extended" > 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="100" /> 
           <ColumnDefinition Width="100" /> 
           <ColumnDefinition Width="100" /> 
          </Grid.ColumnDefinitions> 
          <TextBlock Grid.Column="0" Margin="2" Text="{Binding id}" /> 
          <TextBlock Grid.Column="1" Margin="2" Text="{Binding x}" /> 
          <TextBlock Grid.Column="2" Margin="2" Text="{Binding y}" /> 
         </Grid> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

      <ListBox ItemsSource="{Binding SelectedItems}" Name="XYPointsListboxSelection"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="100" /> 
           <ColumnDefinition Width="100" /> 
           <ColumnDefinition Width="100" /> 
          </Grid.ColumnDefinitions> 
          <TextBlock Grid.Column="0" Margin="2" Text="{Binding id}" /> 
          <TextBlock Grid.Column="1" Margin="2" Text="{Binding x}" /> 
          <TextBlock Grid.Column="2" Margin="2" Text="{Binding y}" /> 
         </Grid> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </StackPanel> 
    </Grid> 
</UserControl> 

這個代碼只是給了一個空的列表框:

SelectionView.xaml

<UserControl x:Class="Silverlight5App.View.Content.SelectionView" 
    xmlns:viewModel="clr-namespace:Silverlight5App.ViewModel"  
    xmlns:behaviours="clr-namespace:Silverlight5App.Behaviours"> 

    <UserControl.Resources> 
     <viewModel:XYPlotViewModel x:Key="ViewModelTest" /> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource ViewModelTest}}" >  
     <StackPanel>    
      <ListBox ItemsSource="{Binding Path=SelectedItems}" Name="XYPointsListboxSelection2"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="100" /> 
          <ColumnDefinition Width="100" /> 
          <ColumnDefinition Width="100" /> 
         </Grid.ColumnDefinitions> 
         <TextBlock Grid.Column="0" Margin="2" Text="{Binding id}" /> 
         <TextBlock Grid.Column="1" Margin="2" Text="{Binding x}" /> 
         <TextBlock Grid.Column="2" Margin="2" Text="{Binding y}" /> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     </StackPanel> 
    </Grid> 
</UserControl> 

PS:語法高亮設置爲t o language-all:lang-xml但似乎不起作用?

回答

1

你應該使用相同的ViewModel實例爲了這個工作。

您可以通過創建視圖模型爲單例並通過代碼(無論是在構造函數中,還是在PageLoaded事件中)通過XAML分配它。

+0

謝謝,那正是我需要的信息!我並不知道我創建了ViewModel的新實例。關於如何製作Singleton ViewModel有很多信息,比如[this example](http://blog.falafel.com/blogs/11-08-17/Singleton_ViewModels_in_Silverlight.aspx) – Phasma 2012-01-11 09:32:44

相關問題