【发布时间】:2021-08-28 22:16:39
【问题描述】:
我正在尝试制作一个 WPF MVVM 应用程序,其中有一个主窗口,其中有一个侧边栏,每个 MVVM 视图都有一个按钮,并且所述窗口的其余部分一次显示一个视图。
(忽略在本例中,侧边栏位于顶部,这仅用于说明目的)
我的目标是能够单击一个按钮并将黄色部分更改为与该按钮对应的视图。
我可以像这样硬编码地做到这一点:
<Button Command={Binding ChangeView} CommandParameter={Binding CalculatorView}/>
public FrameworkElement CurrentControlView { get; set; }
public ICommand ChangeViewCommand { get; }
// command initialization
void ChangeView(string viewName)
{
Type viewType = Type.GetType($"Program.Views.{viewName}");
CurrentControlView = (FrameworkElement)Activator.CreateInstance(viewType);
}
并通过CurrentControlView 属性绑定正在显示的视图。
但是我试图让它自己构建。我的意思是,我想编写代码来查找某个命名空间中的所有 MVVM 约定视图(带有代码隐藏的 XAML 文件),并创建一个按钮,当单击该按钮时,将触发显示其相应视图的代码。
到目前为止,我一直在考虑使用某种反射代码来收集视图,将它们放入一个集合中,然后将 ItemsControl 绑定到该集合,如下所示:
(再次记住图片中的按钮在顶部,但我希望它们在左侧)
<ItemsControl ItemsSource="{Binding ViewsCollection}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="??" Command="{Binding ChangeViewCommand}" CommandParameter="??" HorizontalAlignment="Center" VerticalAlignment="Center" Height="40"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是在这里我不确定要为Content 放置什么,因为我希望按钮显示视图的名称。因此,如果我有“CalculatorView.xaml”,我会修剪“视图”部分,按钮就像图片中的内容“计算器”一样。
我也不知道如何为“CommandParameter”的每个单独按钮传递视图名称。即使传递按钮内容就足够了,因为我可以从那里处理它。
我怎样才能做到这一点?
【问题讨论】:
-
创建一个类,比如
ViewDefinition,具有两个属性string ViewName和Type ViewType。通过获取每个反射的所有视图来填写您的ViewsCollection。将按钮内容绑定到 ViewName,将 CommandParameter 绑定到 ViewType。然后您可以在ChangeViewCommand中创建视图实例,您将获得所需的类型作为参数。 -
视图不应在后面的代码中创建。相反,应该有一组 DataTemplates 用于创建不同视图的不同视图模型。然后将特定选定视图模型的实例分配给 ContentControl 的 Content 属性。将自动选择适当的 DataTemplate 并因此选择适当的视图。见Data Templating Overview。
-
这能回答你的问题吗? C# WPF Navigation Between Pages (Views)
-
@BionicCode,不,因为它是关于硬编码的视图数量。我需要我的动态填充。
-
它是完全动态的。您只需将模型添加到池中并从该池中进行选择。视图将根据适当的 DataTemplate 自动呈现。它不能变得更有活力。