首页 > 解决方案 > 按视图名称 WPF MVVM 返回 ViewModel

问题描述

我是 WPF 和编程世界的新手,我需要帮助。我正在构建一个 WPF MVVM 应用程序。

我想创建一个方法,它采用 a View(或 a 的名称View)并返回其ViewModel. 我需要它来使用(或)ViewModel中的实例,而无需每次都创建一个。我只想将 的名称作为参数并让它返回.MainViewModelShellViewModel= new()ViewViewModel

我正在考虑使用ViewModelLocatorhttps://www.c-sharpcorner.com/article/datacontext-autowire-in-wpf/使其适用于我的情况,但也许有更好的方法可以做到这一点。

另一个想法是在一个类中添加所有ViewModels,例如ViewModelCollector,并实现一个GetViewModel方法并在MainViewModel每次我需要另一个时调用它ViewModel,但这只是一个我不确定如何实现的想法。

这里最好的方法是什么?

我有的:

MainView.xaml:

<Grid>
    <ItemsControl ItemsSource="{Binding NavigationItems, UpdateSourceTrigger=PropertyChanged}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <RadioButton GroupName="Menu" IsChecked="{Binding IsActive, UpdateSourceTrigger=PropertyChanged}"
                            Command="{Binding DataContext.ShowPageCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}} }" 
                            CommandParameter="{Binding NavigationIndex}">
                    <RadioButton.Style>
                        //some style
                    </RadioButton.Style>
                    <RadioButton.Content>
                        <Grid  Margin="25,10">
                            <TextBlock Grid.Row="1" Text="{Binding Name}" />
                        </Grid>
                    </RadioButton.Content>
                </RadioButton>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

MainView.xaml.cs:

public MainView()
{
      InitializeComponent();
      DataContext = new MainViewModel();
}

MainViewModel据我所知,应该在这里注入,但目前不能这样工作)

我有 2 个其他 ViewModel,比如说 FirstViewModel 和 SecondViewModel。服务被注入到两个 ViewModel 的构造函数中。

每个 ViewModel(除了MainViewModel)实现INavigation

string Name { get; set; }
string Source { get; set; }
int NavigationIndex { get; set; }
bool IsActive { get; set; }

ConfigureView每个构造函数中都有一个方法:

public FirstViewModel(SomeService service)
{
    this.service = service ?? throw new ArgumentNullException(nameof(service));

    //not important things

    ConfigureView();
}

private void ConfigureView()
{
    Name = "First";
    Source = "FirstView.xaml";
}

MainViewModel.cs:

public ObservableCollection<INavigation> NavigationItems { get; set; } //it is set in a different way, using INotifyPropertyChanged

public INavigation SelectedNavigation { get; set; } //it is set in a different way, using INotifyPropertyChanged

public ICommand ShowPageCommand { get; set; }

public MainViewModel()
{
    ShowPageCommand = new RelayCommand<int>(ShowPage);

    int index = 0;
    NavigationItems = new ObservableCollection<INavigation>();
    NavigationItems.Add(new FirstViewModel { NavigationIndex = index++, IsActive = true }); //error
    NavigationItems.Add(new SecondViewModel { NavigationIndex = index++ }); //error

    SelectedNavigation = NavigationItems[0];
}

private void ShowPage(int index)
{
    SelectedNavigation = NavigationItems[index];
}

错误是没有默认构造函数。如何在NavigationItems不创建它们的实例的情况下添加 ViewModel MainViewModel

标签: c#wpfmvvmviewmodel

解决方案


推荐阅读