c# - 按视图名称 WPF MVVM 返回 ViewModel
问题描述
我是 WPF 和编程世界的新手,我需要帮助。我正在构建一个 WPF MVVM 应用程序。
我想创建一个方法,它采用 a View
(或 a 的名称View
)并返回其ViewModel
. 我需要它来使用(或)ViewModel
中的实例,而无需每次都创建一个。我只想将 的名称作为参数并让它返回.MainViewModel
ShellViewModel
= new()
View
ViewModel
我正在考虑使用ViewModelLocator
https://www.c-sharpcorner.com/article/datacontext-autowire-in-wpf/并使其适用于我的情况,但也许有更好的方法可以做到这一点。
另一个想法是在一个类中添加所有ViewModel
s,例如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
?
解决方案
推荐阅读
- r - 定义双向条形图中不同类型的颜色
- javascript - 如何在 Laravel 5.8 中使 chart.js 动画/增长/活着?
- python - 为什么不能复制列表并丢失列表的第一个索引?
- openlayers - 使用包含 LineStrings 的矢量源在 OpenLayers 中创建热图
- scala - Spark Structured Streaming Databricks 事件中心架构定义问题
- iis - 未创建 stdoutLog
- javascript - 如何确保在 safari、firefox 和 chrome 中以相同方式处理 tinymce 5 编辑器区域的模糊事件?
- racket - 为什么我的函数总是返回一个空列表?
- java - 如何使用 ProcessLifecycleOwner 捕获生命周期事件?
- python - 带依赖项的 Siblig 导入