2012-11-07 37 views
1

我有一個問題,在我的列表視圖中,當我選擇一個項目時,行突出顯示和屬性值確實設置。但是當我點擊按鈕顯示第二頁時,listview並沒有突出顯示/從前一個選擇。該屬性爲空。每個頁面上的兩個列表視圖引用了itemsource和selecteditem的相同屬性。任何人都可以幫助我爲什麼第二頁不觸發財產?WPF - 當下一個頁面顯示時,屬性爲空

MainWindow.xaml

<UserControl.DataContext> 
     <vm:MainViewModel /> 
    </UserControl.DataContext> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="auto"></ColumnDefinition> 
      <ColumnDefinition Width="5"></ColumnDefinition> 
      <ColumnDefinition Width="auto"></ColumnDefinition> 
      <ColumnDefinition Width="5"></ColumnDefinition> 
      <ColumnDefinition Width="auto"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Button Name="btnPrevious" Content="&lt;" Grid.Column="0" Height="300" Click="btnPrevious_Click"></Button> 
     <Grid Width="310" Height="300" Grid.Column="2"> 
      <Frame x:Name="UserControlContainer" NavigationUIVisibility="Hidden" Width="310" /> 
     </Grid> 
     <Button Name="btnNext" Content="&gt;" Grid.Column="4" Height="300" Click="btnNext_Click"></Button> 
    </Grid> 

MainWindow.xaml.cs

public partial class MainWindow : UserControl 
    { 
     private FirstPage fPage; 
     private SecondPage sPage; 

     private static int oldIndex = 1; 

     public FirstPage FPage 
     { 
      get 
      { 
       if (fPage == null) 
        fPage = new FirstPage(); 

       return fPage; 
      } 
      set 
      { 
       fPage = value; 
      } 
     } 

     public SecondPage SPage 
     { 
      get 
      { 
       if (sPage == null) 
        sPage = new SecondPage(); 

       return sPage; 
      } 
      set 
      { 
       sPage = value; 
      } 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 

      UserControlContainer.Source = new Uri("Views\\FirstPage.xaml", UriKind.Relative); 
     } 

     private void btnPrevious_Click(object sender, RoutedEventArgs e) 
     { 
      var content = UserControlContainer.Content as UserControl; 

      var targetUserControl = this.FPage as UserControl; 
      targetUserControl.DataContext = this.DataContext; 

      this.UserControlContainer.NavigateToControl(targetUserControl, oldIndex, 2); 

      oldIndex = 2; 
     } 

     private void btnNext_Click(object sender, RoutedEventArgs e) 
     { 
      var content = UserControlContainer.Content as UserControl; 

      var targetUserControl = this.SPage as UserControl; 
      targetUserControl.DataContext = this.DataContext; 

      this.UserControlContainer.NavigateToControl(targetUserControl, oldIndex, 1); 

      oldIndex = 1; 
     } 
    } 

MainViewModel.cs

public class MainViewModel : INotifyPropertyChanged 
{ 
    Dictionary<int, string> itemList; 
    KeyValuePair<int, string>? selectedItemList = null; 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String PropertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
     } 
    } 

    public Dictionary<int, string> ItemList 
    { 
     get 
     { 
      itemList = GetItemsList(); 
      return itemList; 
     } 
    } 

    private Dictionary<int, string> GetItemsList() 
    { 
     var resultList = new Dictionary<int, string>(); 

     resultList.Add(1, "Item I"); 
     resultList.Add(2, "Item II"); 
     resultList.Add(3, "Item III"); 

     return resultList; 
    } 

    public KeyValuePair<int, string>? SelectedItemList 
    { 
     get 
     { 
      return selectedItemList; 
     } 
     set 
     { 
      selectedItemList = value; 
      NotifyPropertyChanged("SelectedNewPtLevel"); 
     } 
    } 
} 

FirstPage.xaml

<UserControl.DataContext> 
     <vm:MainViewModel /> 
    </UserControl.DataContext> 

    <Grid> 
     <ListView Name="lstFirst" HorizontalAlignment="Left" 
        Height="auto" ItemsSource="{Binding Path=ItemList}" SelectedItem="{Binding Path=SelectedItemList}" 
        FontSize="11" SelectionMode="Single" Width="310"> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="Background" Value="Yellow"></Setter> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </ListView.ItemContainerStyle> 
      <ListView.View> 
       <GridView> 
        <GridView.ColumnHeaderContainerStyle> 
         <Style> 
          <Setter Property="FrameworkElement.Visibility" Value="Collapsed"/> 
         </Style> 
        </GridView.ColumnHeaderContainerStyle> 
        <GridViewColumn Width="69" DisplayMemberBinding="{Binding Key}"></GridViewColumn> 
        <GridViewColumn Width="109" DisplayMemberBinding="{Binding Value}"></GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 

SecondPage.xaml

<UserControl.DataContext> 
     <vm:MainViewModel /> 
    </UserControl.DataContext> 

    <Grid> 
     <ListView Name="lstSecond" HorizontalAlignment="Left" 
        Height="auto" ItemsSource="{Binding Path=ItemList}" SelectedItem="{Binding Path=SelectedItemList}" 
        FontSize="11" SelectionMode="Single" Width="310"> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="Background" Value="Pink"></Setter> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </ListView.ItemContainerStyle> 
      <ListView.View> 
       <GridView> 
        <GridView.ColumnHeaderContainerStyle> 
         <Style> 
          <Setter Property="FrameworkElement.Visibility" Value="Collapsed"/> 
         </Style> 
        </GridView.ColumnHeaderContainerStyle> 
        <GridViewColumn Width="69" DisplayMemberBinding="{Binding Key}"></GridViewColumn> 
        <GridViewColumn Width="109" DisplayMemberBinding="{Binding Value}"></GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 

回答

2

的問題是,當你點擊第二頁,視圖模型類的新實例是越來越實例化。爲了解決這個問題,我建議將數據上下文綁定到「Locator」類。

<UserControl DataContext="{Binding Source={StaticResource Locator},Path=Main}" 
    ... /> 

(這裏Locator實例坐在你的應用程序的主要參考資料,爲<vm:Locator x:Key=Locator />

定位器類跟蹤模型的一個實例。

public class Locator 
{ 
    private MainViewModel _model; 

    public MainViewModel Main 
    { 
     get 
     { 
      if (_model == null) _model = new MainViewModel(); 
      return _model; 
     } 
    } 
} 
+1

謝謝。現在它工作得很好。我今天又學到了一些新東西。感謝您的幫助和時間。 – Calvin

相關問題