WPF:无法使用DataTemplate动态更改View

时间:2016-04-30 13:31:03

标签: c# wpf xaml mvvm

我在设计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最终失败了。 我无法让它发挥作用。

  1. 你有什么想法吗?
  2. 您是否知道如何在不使用MainWindow中的静态属性的情况下解决动态显示视图的一般问题。我相信这会导致问题,我有一个概念,即我没有使用最优雅的方法。 (我确实希望保持每个View的概念,保存代码以加载任何其他View)
  3. 这是来自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; }
    }
    

    非常感谢你的帮助。

    再见 埃斯肯德

0 个答案:

没有答案