我有两个从同一个BaseViewModel继承的viewmodel,它有一个ObservableCollection作为公共属性。 第一个viewmodel显示ObservableCollection,而第二个viewmodel允许更新集合。
为什么第一个视图看不到更新的集合?
public class BaseViewModel : INotifyPropertyChanged
{
private Playlist _currentPlaylist;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public Playlist CurrentPlaylist
{
get
{
if (_currentPlaylist == null)
{
_currentPlaylist = _library.CurrentPlaylist;
}
return _currentPlaylist;
}
set
{
_currentPlaylist = value;
NotifyPropertyChanged("CurrentPlaylist");
}
}
public BaseViewModel()
{
_library = new Library();
_dbContext = new MusicTrackerDataContext();
}
}
使用继承的BaseViewModel的第一个视图使用CurrentPlaylist
数据绑定。
第二个视图再次设置CurrentPlaylist
:
public class ArtistPageViewModel : BaseViewModel
{
public void PlaylistBtn_Clicked(ListView albumListView)
{
Library.AddSelectionToCurrentPlaylist(albumListView.SelectedItems.Cast<Album>());
CurrentPlaylist = Library.CurrentPlaylist;
}
}
当我设置BaseViewModel
时,看到我的INotifyPropertyChanged
引发了CurrentPlaylist
事件,我希望更新CurrentPlaylist
所绑定的列表视图。
我做错了什么?
修改
显示旧集合的View的代码
public sealed partial class HubPage : Page
{
private HubPageViewModel _hubPageViewModel;
public HubPageViewModel HubPageViewModel
{
get
{
return _hubPageViewModel;
}
}
}
我的HubPageViewModel
<Page
x:Class="MyProject.HubPage"
DataContext="{Binding HubPageViewModel, RelativeSource={RelativeSource Self}}"
mc:Ignorable="d">
<HubSection x:Uid="HubSection5" Header="Now Playing"
DataContext="{Binding CurrentPlaylist}" HeaderTemplate="{ThemeResource HubSectionHeaderTemplate}">
<DataTemplate>
<ListView
SelectionMode="None"
IsItemClickEnabled="True"
ItemsSource="{Binding Tracks}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Title}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
</HubSection>
</HubSection>
修改2
我已将代码更改为以下内容(根据评论)
public sealed partial class HubPage : Page
{
private readonly NavigationHelper navigationHelper;
private static HubPageViewModel _hubPageViewModel; // Made it static
public HubPageViewModel HubPageViewModel
{
get
{
return _hubPageViewModel;
}
}
}
<Page
x:Class="MyProject.HubPage"
DataContext="{Binding HubPageViewModel, RelativeSource={RelativeSource Self}}"
xmlns:vm="using:MyProject.ViewModels" // Added reference to my VM
mc:Ignorable="d">
<ResourceDictionary>
<vm:HubPageViewModel x:Name="hubPageViewModel"/> // Added the key
</ResourceDictionary>
<HubSection x:Uid="HubSection5" Header="Now Playing"
DataContext="{Binding Source={StaticResource hubPageViewModel}}" HeaderTemplate="{ThemeResource HubSectionHeaderTemplate}">
<DataTemplate>
<ListView
SelectionMode="None"
IsItemClickEnabled="True"
ItemsSource="{Binding CurrentPlaylist.Tracks}"
ItemClick="ItemView_ItemClick">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,27.5" Holding="StackPanel_Holding">
<TextBlock Text="{Binding Title}" Style="{ThemeResource ListViewItemTextBlockStyle}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
</HubSection>
但是当我从第二个视图模型返回时,它仍然没有更新。
答案 0 :(得分:3)
尽管两个视图模型都继承了相同的基类,但两个视图模型之间不共享基类的状态。也就是说,HubPageViewModel
和ArtistPageViewModel
不共享同一个播放列表实例。它们是完全不同的属性。
由于两个视图模型都指向同一个播放列表实例且该实例是ObservableCollection
,因此对于ObservableCollection
实例的所有更改都将在两个视图模型之间共享,因为两个视图都绑定到他们正在观看的实例的“收集已更改”通知。在您的示例中,ArtistPageViewModel.PlaylistBtn_Clicked
不会更改ObservableCollection
中的数据,它会更改集合本身。这会更改第二个视图正在观看的集合,但不会更改第一个视图的集合。