【问题标题】:Changing the title of the window from a user control从用户控件更改窗口的标题
【发布时间】:2016-09-18 19:45:00
【问题描述】:

我有一个使用多壳棱镜的解决方案。我几乎让它工作了,但有一件事让我很难过。好吧,两个,但两者的答案都是一样的,因为两者都是主窗口的属性。

当我将用户控件注入 Shell 时,我需要更改窗口的标题。

我正在使用 ViewModelLocator、IRegionManager,并通过引导程序运行所有导航(感谢 Brian Lagunas 提供了出色的复数模块,顺便说一句)

我需要做的是在将新视图注入内容区域时更改 Shell 窗口的标题。这些视图都是作为用户控件创建的。

我目前在我的 shell.xaml 代码中有标题的标准绑定,

   Title="{Binding Title}"

我在 ShellViewModel.cs 中使用一些非常简单的代码在 Shell 初始化时设置它。

    public string ViewTitle = "<window title here>";
    public string Title
    {
       get { return ViewTitle; }
       set { if (ViewTitle != null) SetProperty(ref ViewTitle, value); }
    }

【问题讨论】:

  • 呃,那问题是什么?
  • 我认为我的问题已经很详细了。当视图被注入内容区域时,如何更改窗口的标题?目前,它的编码方式是静态的。
  • 我不确定我是否理解您在这种情况下对“静态”的定义。由于您有标题绑定,我假设您已尝试为变量分配新值但它不起作用?
  • 是的,我尝试从用户控件中分配它,但没有成功。
  • 我要结束这个问题了。我的布局和实施将朝着不同的方向发展。

标签: c# shell prism


【解决方案1】:

这是一个老问题,但我目前正在处理同样的情况。我对使用 Prism 的 MVVM 比较陌生,但想记录一下我是如何解决这个问题的,以防其他人在寻找答案时偶然发现这个问题。

  1. 创建一个继承自 BindableBase 的新类并为其添加一个 title 属性:

    public class BindableBaseExtended : BindableBase
    {
        private string _mainTitle;
        public string MainTitle
        {
            get { return _mainTitle; }
            set { _mainTitle = value; }
        }
    }
    
  2. 在您的 MainWindow(或您用作外壳的任何东西)中,为您的 ContentControl 命名

    <ContentControl Grid.Row="1" x:Name="mainContent" prism:RegionManager.RegionName="...
    
  3. 在您的 MainWindow(shell) 中,通过名称和路径绑定到内容控件元素,我们将在其中设置标题:

    <TextBlock HorizontalAlignment="Center" 
               VerticalAlignment="Center" 
               FontSize="22" 
               Text="{Binding Content.DataContext.MainTitle, ElementName=mainContent}" />
    
  4. 对于将提供标题更改的主要内容面板,使它们继承自 BindableBaseExtended(以前继承 BindableBase):

    public class ViewBViewModel : BindableBaseExtended
    
  5. 在类的实例化(有人在那里导航)设置您的 MainTitle 属性:

    public ViewBViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        MainTitle = "View B";
        eventAggregator.GetEvent<UpdateTitleEvent>().Subscribe(Updated);
    }
    

您的属性现在将通过您的用户控件提供给您的 shell,并会在导航时更改。很想听听有关如何改进这一点的任何反馈,或者指出已经以更正确的方式实施的地方,但现在我想分享这个版本,以防其他人被卡住。

【讨论】:

  • 问题是如果嵌套深度超过一层会发生什么,在我的场景中,我有一个显示嵌套区域的区域。上视图模型对内部视图模型一无所知,而我想从内部视图更改主窗口的标题。我猜聚合器是唯一的出路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多