2016-03-30 2 views
1

имеют MainWindow, где я перемещаюсь между UserControls, нажимая на меню, и он отлично работает.Update ViewModel и View

Я использую этот следующий шаблон с Prism:

https://rachel53461.wordpress.com/2011/05/08/simplemvvmexample/

После сохранения информации мне нужно обновить ViewModel, его обновить, но вид не обновляется. Как я могу это исправить?

MainViewModel

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; 
      } 
     } 
    } 

MainView

<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> 

ответ

4

Использование ObservableCollection<T> вместо List<T> если вы хотите, чтобы уведомить, когда есть добавление/удаление в этой коллекции, используйте OnPropertyChanged, если есть обновление в статье

+0

Спасибо. Легко, он отлично работает. – Cantinou