我在设计WPF应用程序时遇到问题。我无法动态更改视图。调用另一个View的代码包含在Views本身中。 (我正在尝试实现MVVM模式。除了分配DataContext之外,我不希望View xaml文件中有任何代码。在MainWindow的xaml文件中有异常。)
基本上,我有一个包含UserControl的Window。 UserControl是我的View,它通过Datacontext连接到另一个作为ViewModel的类。
我想要做的是动态更改Window中包含的View / ViewModel对。
我的想法是在MainWindow的ViewModel中定义一个静态属性,并将当前View的ViewModel存储在其中。然后我计划在静态属性中存储新的ViewModel时使用DataTemplates自动加载新的视图。
我决定使用静态属性,因为加载另一个ViewModel的代码包含在ViewModel本身中,我需要一个可以从任何地方访问的中心点。
到目前为止一切顺利。我的初始View加载并正确显示。
但是,虽然新的ViewModel已正确分配给静态属性,但按下该视图中的按钮以加载下一个视图会失败。 我尝试了几件事。
我在ContentControl中定义了DataTriggers以响应静态属性的变化。没有帮助。
由于属性的静态特性(或者我做错了),实现INotifyProperty和DependencyProperty最终失败了。 我无法让它发挥作用。
这是来自MainWindow的代码片段:
<UserControl>
<UserControl.Resources>
<DataTemplate DataType="{x:Type vm:StartViewModel}">
<v:StartView></v:StartView>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:OverviewViewModel}">
<v:OverviewView></v:OverviewView>
</DataTemplate>
</UserControl.Resources>
<Grid>
<ContentControl Content="{Binding ActiveViewModel}">/ContentControl>
</Grid>
</UserControl>
代码背后:
DataContext = new MainViewModel();
MainViewModel包含属性ActiveViewModel的定义。该类的构造函数是静态的。所有ViewModel都继承自BaseViewModel类:
private static BaseViewModel activeViewModel;
static public BaseViewModel ActiveViewModel
{
get { return activeViewModel; }
set { activeViewModel = value; }
}
非常感谢你的帮助。
再见 埃斯肯德