我有一个带有多个框架的窗口。每个框架包含一个或多个页面。所有页面使用相同的ViewModel。我控制每个框架的可见性来操纵UI。

我最近意识到,当我的程序启动时,每个Pages都将触发ViewModel的同一个构造函数(因此,同一构造函数将被多次触发)(一个简单的MessageBox.Show构造函数在启动时被触发多次)。对于我来说这是为什么是合理的,但不是我想要的。

另外,我开始相信在C#中处理不同的框架会遇到麻烦的原因是因为我可能已经创建了ViewModel的新“对象”?我不确定这是否正在发生,但是我很确定这不是我想要的。

有没有一种方法可以设置Pages的DataContext(以Xaml格式),以便构造函数仅触发一次,但仍将每个页面的DataContext设置为ViewModel?还是我应该探索另一种方法?我仍在学习...

每个页面具有以下Xaml:

<Page.DataContext>
    <ViewModel:ActiveJobViewModel/>
</Page.DataContext>

我的相框看起来像这样。我意识到一个框架可以容纳多个页面,但是操纵可见性可以使我获得更好的性能,并且我不希望每次Page源更改时都运行构造函数。
<Frame Source="ActiveJobPage.xaml" Grid.Row="2" Grid.Column="3"
       Visibility="{Binding ElementName=ActiveJobPageToggleButton, Path=IsChecked, Converter={StaticResource booleanToVisibility}, UpdateSourceTrigger=PropertyChanged}"
       Style="{StaticResource FramePage}">
</Frame>

<Frame  Source="CustomerPage.xaml" Grid.Row="2" Grid.Column="3"
        Visibility="{Binding objHomePage_PageVisibility.CustomersPageToggleButtonIsChecked, Converter={StaticResource booleanToVisibility}, UpdateSourceTrigger=PropertyChanged}"
        Style="{StaticResource FramePage}">
</Frame>

最佳答案

从Page XAML中删除以下内容。

<Page.DataContext>
    <ViewModel:ActiveJobViewModel/>
</Page.DataContext>

并在代码中手动将两个页面的DataContext设置为相同的实例。

例如,在您的Page代码隐藏类中。
public void SetDataContext(ActiveJobViewModel commonContext)
{
   this.DataContext = commonContext;
}

然后创建ActiveJobViewModel实例的公共(public)实例,并为多个页面设置相同的datacontext。

关于wpf - WPF将相同的DataContext分配给多页MVVM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51912815/

10-17 03:10