我有一个使用多个炮弹的解决方案。我几乎让它工作了,但有一件事让我感到难过。好吧,两个,但两者的答案都是一样的,因为两者都是主窗口的属性。
当我将用户控件注入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); }
}
答案 0 :(得分:1)
这是一个老问题,但我目前正在处理同样的情况。我对使用Prism的MVVM相对较新,但是想要记录我是如何解决这个问题的,如果有人在搜索答案时偶然发现了这个问题。
创建一个继承自BindableBase的新类,并为其添加title属性:
public class BindableBaseExtended : BindableBase
{
private string _mainTitle;
public string MainTitle
{
get { return _mainTitle; }
set { _mainTitle = value; }
}
}
在您的MainWindow(或您作为shell使用的任何内容)中,为您的ContentControl命名
<ContentControl Grid.Row="1" x:Name="mainContent" prism:RegionManager.RegionName="...
在MainWindow(shell)中,按名称和路径标记内容控制元素,我们将设置标题:
<TextBlock HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="22"
Text="{Binding Content.DataContext.MainTitle, ElementName=mainContent}" />
对于将要更改标题的主要内容面板,让它们继承自BindableBaseExtended(之前继承BindableBase):
public class ViewBViewModel : BindableBaseExtended
在实例化类(在那里导航的人)中设置您的MainTitle属性:
public ViewBViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
MainTitle = "View B";
eventAggregator.GetEvent<UpdateTitleEvent>().Subscribe(Updated);
}
您的属性现在将通过您的用户控件提供给您的shell,并将在导航时更改。很想听到有关如何改进这一点的任何反馈,或者指出我已经以更正确的方式实施的地方,但是现在我想在任何其他人被卡住的情况下分享这个版本。