wpf - 如何保持用户控制?

标签 wpf mvvm keep-alive

我有与包含用户控件的 ContentControl 一起使用的向导项目。
我在主窗口中通过 XAML 文件进行实例化:

    <DataTemplate DataType="{x:Type ViewModel:OpeningViewModel}">
        <view:OpeningView/>
   </DataTemplate>

    <DataTemplate DataType="{x:Type ViewModel:SecondUCViewModel}">
        <view:SecondUCView/>
    </DataTemplate>

但是当我在 UC 之间导航时,似乎 UC 不像“保持活力”那样工作,每次 UC 切换都会创建新实例。我怎样才能避免它?
我只想为每个 UC 创建一个实例,并且只在这些实例之间导航而不创建新实例。

我知道如何编写单例,但我的项目基于 MVVM,而且我对 WPF 很陌生,所以我不确定最好的方法是什么。

谢谢

更新:

这里是viewModel的代码:

在 viewModel 我有:

私有(private) ObservableCollection _pages = null;
私有(private) NavigationBaseViewModel _currentPage;
    #endregion

    #region Properties

    public int CurrentPageIndex
    {
        get
        {
            if (this.CurrentPage == null)
            {
                return 0;
            }
            return _pages.IndexOf(this.CurrentPage);
        }
    }

    public NavigationBaseViewModel CurrentPage
    {
        get { return _currentPage; }

        private set
        {
            if (value == _currentPage)
                return;

            _currentPage = value;
            OnPropertyChanged("CurrentPage");
        }
    }

私有(private) ICommand _NavigateNextCommand;
公共(public) ICommand NavigateNextCommand
{
得到
{
如果(_NavigateNextCommand == null)
{
_NavigateNextCommand = new RelayCommand(param => this.MoveToNextPage(), param => CanMoveToNextPage);
}
返回_NavigateNextCommand;
}
}
    private ICommand _NavigateBackCommand;
    public ICommand NavigateBackCommand
    {
        get
        {
            if (_NavigateBackCommand == null)
            {
                _NavigateBackCommand = new RelayCommand(param => this.MoveToPreviousPage(), param => CanMoveToPreviousPage);
            }
            return _NavigateBackCommand;
        }
    }



   private bool CanMoveToNextPage
    {
        get
        {
            return this.CurrentPage != null && this.CurrentPage.CanMoveNext;
        }
    }

    bool CanMoveToPreviousPage
    {
        get { return 0 < this.CurrentPageIndex && CurrentPage.CanMoveBack; }
    }

    private void MoveToNextPage()
    {
        if (this.CanMoveToNextPage)
        {
            if (CurrentPageIndex >= _pages.Count - 1)
                Cancel();
            if (this.CurrentPageIndex < _pages.Count - 1)
            {
                this.CurrentPage = _pages[this.CurrentPageIndex + 1];
            }
        }
    }

    void MoveToPreviousPage()
    {
        if (this.CanMoveToPreviousPage)
        {
            this.CurrentPage = _pages[this.CurrentPageIndex - 1];
        }
    }

以及包含绑定(bind)到 CurrentPage 的 UC 的 ContentControl

最佳答案

您可以通过在 XAML 中硬编码 UserControls 而不是使用 DataTemplates 来做到这一点。 DataTemplates 将在每次实例化时创建新的控件。但是,由于您使用 MVVM,因此您还可以在 ViewModel 的更改之间移动您希望保留的所有数据,并确保 ViewModel 对象始终相同。然后,DataTemplates 仍将创建新控件,但它们将包含与以前相同的信息。

关于wpf - 如何保持用户控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646803/

相关文章:

wpf - 在数据网格的组合框列中显示图像

wpf - 检测 Canvas 内移动的 UIElement 的正确事件

c# - 从异步方法更新 SystemTray ProgressIndicator 值

.net - 从区域中删除 View 时内存泄漏

registration - 在iOS9中不建议使用setKeepAliveTimeout

http - 浏览器如何处理 HTTP keepalive 竞争条件?

java - AWS Lambda 会将您的闲置函数保留多长时间?

WPF - 在 ViewModel 中处理 ApplicationCommand

c# - FocusLost 在用户控制 [wpf]

c# - 将 MenuItems 命令绑定(bind)到 UserControls DataContext