Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新视图模型和视图_C#_Wpf_Xaml_Mvvm_Prism - Fatal编程技术网

C# 更新视图模型和视图

C# 更新视图模型和视图,c#,wpf,xaml,mvvm,prism,C#,Wpf,Xaml,Mvvm,Prism,有一个主窗口,我可以通过单击菜单在用户控件之间导航,它工作正常 我在Prism中使用以下图案: 保存信息后,我需要更新ViewModel, 我更新了它,但视图没有更新。 我怎样才能修好它 MainViewModel 公共类AdminMenuViewModel:ObserveObject,IPageViewModel { 受保护的只读IEventagegrator\u事件聚合器; 公共管理员视图模型(IEventAggregator事件聚合器) { 添加(新的FoodSupplierViewM

有一个主窗口,我可以通过单击菜单在用户控件之间导航,它工作正常

我在Prism中使用以下图案:

保存信息后,我需要更新ViewModel, 我更新了它,但视图没有更新。 我怎样才能修好它

MainViewModel
公共类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>