我是WPF和MVVM的初学者,但想通过构建一些小项目来学习它。
我有一个基于Rachel Lim示例的使用Model-View-ViewModel模式的WPF应用程序。在我的应用程序中,我有2个 View -EmployeesList和EmployeeDetails。
员工列表存储在GidView中。

我的主要问题是

  • 双击一行
  • 时如何更改 View
  • 如何从第一列(employee_id)中获取值并将其传递到EmployeeDetails View 。

  • 基本导航在带有DataTmplate和ItmCntrol的xaml中:
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:HomeViewModel}">
            <local:HomeView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:EmployeesListViewModel}">
            <local:EmployeesListView />
        </DataTemplate>
    </Window.Resources>
    
    
    
    <ItemsControl ItemsSource="{Binding PageViewModels}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding Name}"
                        Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                        CommandParameter="{Binding }"
                        Margin="2,5"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    我也有ApplicationViewModel在哪里 View 列表
    public class ApplicationViewModel : ObservableObject
    {
        #region Fields
    
        private ICommand _changePageCommand;
    
        private IPageViewModel _currentPageViewModel;
        private List<IPageViewModel> _pageViewModels;
    
        #endregion
    
        public ApplicationViewModel()
        {
            // Add available pages
            PageViewModels.Add(new HomeViewModel());
            PageViewModels.Add(new EmployeesListViewModel());
            PageViewModels.Add(new EmployeeDetailsViewModel());
    
            // Set starting page
            CurrentPageViewModel = PageViewModels[0];
        }
    
        #region Properties / Commands
    
        public ICommand ChangePageCommand
        {
            get
            {
                if (_changePageCommand == null)
                {
                    _changePageCommand = new RelayCommand(
                        p => ChangeViewModel((IPageViewModel)p),
                        p => p is IPageViewModel);
                }
    
                return _changePageCommand;
            }
        }
    
        public List<IPageViewModel> PageViewModels
        {
            get
            {
                if (_pageViewModels == null)
                    _pageViewModels = new List<IPageViewModel>();
    
                return _pageViewModels;
            }
        }
    
        public IPageViewModel CurrentPageViewModel
        {
            get
            {
                return _currentPageViewModel;
            }
            set
            {
                if (_currentPageViewModel != value)
                {
                    _currentPageViewModel = value;
                    OnPropertyChanged("CurrentPageViewModel");
                }
            }
        }
    
        #endregion
    
        #region Methods
    
        private void ChangeViewModel(IPageViewModel viewModel)
        {
            if (!PageViewModels.Contains(viewModel))
                PageViewModels.Add(viewModel);
    
            CurrentPageViewModel = PageViewModels
            .FirstOrDefault(vm => vm == viewModel);
        }
    
        #endregion
    }
    

    最佳答案

    双击行时如何更改 View

    首先,您需要为MouseDoubleClick事件添加EventTrigger:

        <DataGrid Name="gridEmployees" ItemsSource="{Binding Employees}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick">
                    <local:CustomCommandAction Command="{Binding DoubleClickCommand}" CommandParameter="{Binding ElementName=gridEmployees, Path=SelectedItems[0]}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </DataGrid>
    

    CustomCommandAction是一个类,它继承自TriggerAction,并用作 View 模型中事件和命令之间的链接。这是代码:
    public sealed class CustomCommandAction : TriggerAction<DependencyObject>
    {
        public static readonly DependencyProperty CommandParameterProperty =
            DependencyProperty.Register("CommandParameter", typeof(object), typeof(CustomCommandAction), null);
    
        public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
            "Command", typeof(ICommand), typeof(CustomCommandAction), null);
    
        public ICommand Command
        {
            get
            {
                return (ICommand)this.GetValue(CommandProperty);
            }
            set
            {
                this.SetValue(CommandProperty, value);
            }
        }
    
        public object CommandParameter
        {
            get
            {
                return this.GetValue(CommandParameterProperty);
            }
    
            set
            {
                this.SetValue(CommandParameterProperty, value);
            }
        }
    
        protected override void Invoke(object parameter)
        {
            if (this.AssociatedObject != null)
            {
                ICommand command = this.Command;
                if (command != null)
                {
                    if (this.CommandParameter != null)
                    {
                        if (command.CanExecute(this.CommandParameter))
                        {
                            command.Execute(this.CommandParameter);
                        }
                    }
                    else
                    {
                        if (command.CanExecute(parameter))
                        {
                            command.Execute(parameter);
                        }
                    }
                }
            }
        }
    }
    

    之后,最简单的解决方案是在您的命令Execute方法中使用ChangeViewModel方法,例如:
    ...
    
    _doubleClickCommand = new RelayCommand(OnDoubleClick);
    ...
    
        private RelayCommand _doubleClickCommand = null;
        private ApplicationViewModel _applicationViewModel;
    
        private void OnDoubleClick(object obj)
        {
            EmployeeDetailsViewModel selectedModel = obj as  EmployeeDetailsViewModel;
    
            _applicationViewModel.ChangeViewModel(selectedModel);
        }
    
        public ICommand DoubleClickCommand
        {
            get
            {
                return _doubleClickCommand;
            }
        }
    

    如何从第一列(employee_id)获取值并将其传递到EmployeeDetails View

    对于您的DataGrid,您可以使用EmployeeDetailsViewModel的集合作为ItemsSource。如果这样做,所选项目将作为EmployeeDetailsViewModel的实例传递到命令Execute方法,您将能够从那里获取ID。

    关于c# - 更改 View Wpf MVVM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34807591/

    10-12 12:45