作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
应用程序位于 prism/mvvm/mef 中,并使用 StockTraderRI 等属性加载。
我的外壳窗口包含一个状态栏的 DockPanel,它是外壳的全局,而不是每个区域的本地。
看起来像这样:
<DockPanel>
<StatusBar DockPanel.Dock="Bottom">
<StatusBarItem>
<TextBlock Text="{Binding Source={x:Static bcl:Configuration.Global}, Path=LoggedOn.User}"/>
</StatusBarItem>
<StatusBarItem>
<TextBlock Text="{Binding StateMessage}"/>
</StatusBarItem>
</StatusBar>
<ContentControl x:Name="MainContent" cal:RegionManager.RegionName="MainRegion"/>
</DockPanel>
<TextBlock Text="{Binding Path=DataContext.StateMessage,Source={StaticResource MainContent}}"/>
最佳答案
我不认为您将能够找到一种直接绑定(bind)到区域中对象中的属性的干净方法。您可能能够做到这一点的一种方法是让指定区域中的所有 View 都从一个公共(public)接口(interface)继承,以便它们都实现相同的属性(例如,SystemName)。您可以绑定(bind)到包含该属性的路径,并使用 ValueConverter 将类型从 System.Object 更改为接口(interface)类型。
我遇到的问题是它限制了您可以放入该区域的内容,并且似乎将 shell 与其中显示的类型结合起来比我个人想要的更多。我建议采用不同的方法:由于您的状态栏是您的外壳的一部分,因此为外壳提供一个 ViewModel,其中状态栏绑定(bind)到您的属性,并使用事件来跟踪状态值何时更改。这样做的一些好处:
// Use normal binding for Shell -> ShellViewModel
public sealed ShellViewModel : INotifyPropertyChanged
{
private readonly IEventAggregator = eventAggregator;
public ShellViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.GetEvent<MainRegionViewLoaded>.Subscribe(
new Action<Object>(HandleMainRegionViewLoaded));
}
private String _statusName;
public String StatusName
{
get { return _statusName; }
set
{
if (_statusName != value)
{
_statusName = value;
RaisePropertyChanged("StatusName"); // Not showing this...
}
}
}
private void HandleMainRegionViewLoaded(Object param)
{
// Not doing all the checking here, such as null, etc.
var statusName = param as String;
StatusName = statusName;
}
}
public void MainView : UserControl, IActiveAware
{
private readonly IEventAggregator _eventAggregator;
public MainView(IEventAggregator eventAggregator)
{
InitializeComponent();
_eventAggregator = eventAggregator;
}
private bool _isActive;
public bool IsActive
{
get { return _isActive; }
set
{
if (value)
{
_eventAggregator.GetEvent<MainRegionViewLoaded>.Publish(new MainRegionViewLoaded("My Name"));
}
_isActive = value;
}
}
}
关于mvvm - Prism :如何将 shell.xaml 中的内容绑定(bind)到区域内容变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4448640/
我是一名优秀的程序员,十分优秀!