C# 将视图注入主窗口
我有以下问题: 我想以最佳实践风格实现MvvM,所以我想像中一样实现MvvM。视频需要约1小时,因此我压缩了内容:C# 将视图注入主窗口,c#,wpf,mvvm,C#,Wpf,Mvvm,我有以下问题: 我想以最佳实践风格实现MvvM,所以我想像中一样实现MvvM。视频需要约1小时,因此我压缩了内容: 在App.xaml.cs中,OnStartup-事件被覆盖,因此我手动实例化了主窗口 有一个MainViewModel包含一个observeCollection属性,main窗口的ItemsControl绑定到该属性 此MainViewModel正在App.xaml.cs中实例化,并且main窗口的DataContext设置为此 main窗口.xaml包含一个类型为ViewMod
- 在
中,App.xaml.cs
-事件被覆盖,因此我手动实例化了主窗口OnStartup
- 有一个
包含一个MainViewModel
属性,observeCollection
main窗口的
绑定到该属性ItemsControl
- 此
正在MainViewModel
中实例化,并且App.xaml.cs
main窗口的
设置为此DataContext
包含一个类型为main窗口.xaml
的ViewModelBase
,并包含一个DataTemplate
MainView
View
s和ViewModel
s。但是,当我在MainView
中放置多个视图时,只有一个视图
填充了值(每次都是视图,它位于MainView.xaml
的第一位)。我知道它应该如何工作:
所有视图都放置在MainView
中,MainView
显示在main窗口中。由于我将main窗口的DataContext
设置为MainViewModel
,因此main窗口的ItemsControl
(它是ItemsSource
)成功绑定到MainViewModel
的ViewModels
集合。
但我从未将特定视图的DataContext
设置为相应的ViewModel
。Visual Studio是否根据命名约定自动绑定相应的视图
s和视图模型
s
但是,只有首先放置在主视图中的视图
,才填充了值。当我交换2号和1号的时候View
s在XAML
-文件中,以前的第二个View
现在可以工作,但以前的第1个可以工作<代码>视图
不再填充任何值。为什么会这样?
当然,如果你愿意,我可以添加特定的代码
但我从未将特定视图的DataContext设置为其相应的ViewModel。Visual Studio是否根据命名约定自动绑定相应的视图和视图模型
现在我知道,我设置的DataTemplate
将DataType
的每个实例替换为我想要实例化的类的一个实例。
因此,每个视图
都将映射到主视图(然后主视图将映射到main窗口
),方法是将每个相应的“视图模型”实例替换为其视图
一个问题解决,另一个问题弹出:
我在资源字典中的App.xaml
中声明了一些样式:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Orange.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseDark.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
当我添加所需的数据模板时:
<Application.Resources>
<DataTemplate DataType="{x:Type vm:OperationViewModel}" x:Key="OpKey">
<v:OperationView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:PlayerViewModel}" x:Key="PKey">
<v:PlayerView/>
</DataTemplate>
<ResourceDictionary x:Key="MetroStyle">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Orange.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseDark.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
但是我得到了一种黑屏,这样声明的样式(不是DataTemplate
)就不会被应用。我对ResourceDictionary
s和App.Xaml
真的不太了解,所以我怎么解决这个问题呢?你能发布一些代码吗..谢谢你想帮我,但我发现了我的错误。我很快会给你回复的