从用户控件更改窗口的标题

时间:2016-09-18 19:45:01

标签: c# shell prism

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

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

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

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

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

   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); }
    }

1 个答案:

答案 0 :(得分:1)

这是一个老问题,但我目前正在处理同样的情况。我对使用Prism的MVVM相对较新,但是想要记录我是如何解决这个问题的,如果有人在搜索答案时偶然发现了这个问题。

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

    public class BindableBaseExtended : BindableBase
    {
        private string _mainTitle;
        public string MainTitle
        {
            get { return _mainTitle; }
            set { _mainTitle = value; }
        }
    }
    
  2. 在您的MainWindow(或您作为shell使用的任何内容)中,为您的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);
    }
    
  6. 您的属性现在将通过您的用户控件提供给您的shell,并将在导航时更改。很想听到有关如何改进这一点的任何反馈,或者指出我已经以更正确的方式实施的地方,但是现在我想在任何其他人被卡住的情况下分享这个版本。