C# 更新视图模型和视图
有一个主窗口,我可以通过单击菜单在用户控件之间导航,它工作正常 我在Prism中使用以下图案: 保存信息后,我需要更新ViewModel, 我更新了它,但视图没有更新。 我怎样才能修好它 MainViewModelC# 更新视图模型和视图,c#,wpf,xaml,mvvm,prism,C#,Wpf,Xaml,Mvvm,Prism,有一个主窗口,我可以通过单击菜单在用户控件之间导航,它工作正常 我在Prism中使用以下图案: 保存信息后,我需要更新ViewModel, 我更新了它,但视图没有更新。 我怎样才能修好它 MainViewModel 公共类AdminMenuViewModel:ObserveObject,IPageViewModel { 受保护的只读IEventagegrator\u事件聚合器; 公共管理员视图模型(IEventAggregator事件聚合器) { 添加(新的FoodSupplierViewM
公共类AdminMenuViewModel:ObserveObject,IPageViewModel
{
受保护的只读IEventagegrator\u事件聚合器;
公共管理员视图模型(IEventAggregator事件聚合器)
{
添加(新的FoodSupplierViewModel());
添加(新产品视图模型());
添加(新的UnitViewModel());
添加(新的PriceViewModel());
这。_eventAggregator=eventAggregator;
此.u eventAggregator.GetEvent().Subscribe(UpdateProduct);
//设置起始页
CurrentUserControl=PageViewModels[0];
}
公共字符串名
{
收到
{
返回“Admin”;
}
}
私有列表pageViewModels;
公共列表页面视图模型
{
收到
{
如果(_pageViewModels==null)
_pageViewModels=新列表();
返回页面视图模型;
}
}
私有void UpdateProduct()
{
PageViewModels[1]=新产品ViewModel();//我在这里更新ViewModel
}
私有void ChangeViewModel(IUserContentViewModel viewModel)
{
如果(!PageViewModels.Contains(viewModel))
PageViewModels.Add(viewModel);
CurrentUserControl=PageViewModels
.FirstOrDefault(vm=>vm==viewModel);
}
专用ICommand _changePageCommand;
公共ICommand ChangePageCommand
{
收到
{
如果(_changePageCommand==null)
{
_changePageCommand=newrelaycommand(
p=>ChangeViewModel((IUserContentViewModel)p),
p=>p是IUserContentViewModel);
}
返回_changepage命令;
}
}
}
MainView
如果要在该集合中存在添加/删除时通知,请使用
可观察集合
而不是列表
,使用OnPropertyChanged
如果项目中有更新使用observedcollection
而不是List
如果要在该集合中有添加/删除时发出通知,如果项目中有更新,请使用OnPropertyChanged
public class AdminMenuViewModel : ObservableObject, IPageViewModel
{
protected readonly IEventAggregator _eventAggregator;
public AdminMenuViewModel(IEventAggregator eventAggregator)
{
PageViewModels.Add(new FoodSupplierViewModel());
PageViewModels.Add(new ProductViewModel());
PageViewModels.Add(new UnitViewModel());
PageViewModels.Add(new PriceViewModel());
this._eventAggregator = eventAggregator;
this._eventAggregator.GetEvent<UpdateProduct>().Subscribe(UpdateProduct);
// Set starting page
CurrentUserControl = PageViewModels[0];
}
public string Name
{
get
{
return "Admin";
}
}
private List<IUserContentViewModel> _pageViewModels;
public List<IUserContentViewModel> PageViewModels
{
get
{
if (_pageViewModels == null)
_pageViewModels = new List<IUserContentViewModel>();
return _pageViewModels;
}
}
private void UpdateProduct()
{
PageViewModels[1] = new ProductViewModel(); //I update the ViewModel here
}
private void ChangeViewModel(IUserContentViewModel viewModel)
{
if (!PageViewModels.Contains(viewModel))
PageViewModels.Add(viewModel);
CurrentUserControl = PageViewModels
.FirstOrDefault(vm => vm == viewModel);
}
private ICommand _changePageCommand;
public ICommand ChangePageCommand
{
get
{
if (_changePageCommand == null)
{
_changePageCommand = new RelayCommand(
p => ChangeViewModel((IUserContentViewModel)p),
p => p is IUserContentViewModel);
}
return _changePageCommand;
}
}
}
<UserControl.Resources>
<DataTemplate DataType="{x:Type avm:FoodSupplierViewModel}">
<av:FoodSupplierView/>
</DataTemplate>
<DataTemplate DataType="{x:Type avm:ProductViewModel}">
<av:ProductView/>
</DataTemplate>
<DataTemplate DataType="{x:Type avm:UnitViewModel}">
<av:UnitView/>
</DataTemplate>
<DataTemplate DataType="{x:Type avm:PriceViewModel}">
<av:PriceView/>
</DataTemplate>
</UserControl.Resources>
<Grid Margin="5" >
<Border BorderThickness="1" BorderBrush="Black" CornerRadius="10">
<Grid>
<Border Name="mask" Background="White" CornerRadius="9"/>
<StackPanel>
<Menu Grid.Row="0" Height="58">
<MenuItem Header="General" FontSize="20" Height="38" Margin="10" Foreground="SteelBlue">
<ItemsControl ItemsSource="{Binding PageViewModels}" Width="168" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
CommandParameter="{Binding}" TextDecorations="{x:Null}">
<InlineUIContainer>
<TextBlock Text="{Binding Name}" FontSize="18"/>
</InlineUIContainer>
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</MenuItem>
</Menu>
</StackPanel>
</Grid>
</Border>
<Border Grid.Row="1" BorderThickness="1" CornerRadius="8" >
<ContentControl Content="{Binding CurrentUserControl}" Margin="0,0,-1,0"/>
</Border>
</Grid>