gpt4 book ai didi

mvvm - Prism :如何将 shell.xaml 中的内容绑定(bind)到区域内容变量?

转载 作者:行者123 更新时间:2023-12-03 10:30:37 26 4
gpt4 key购买 nike

应用程序位于 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>

绑定(bind)到全局变量确实很有效。现在,我想将 StatusBarItem 中的 StateMessage 绑定(bind)到加载到 MainRegion 中的任何控件中的属性 StateMessage。
我的第一个猜测是使用类似的东西:
<TextBlock Text="{Binding Path=DataContext.StateMessage,Source={StaticResource MainContent}}"/>

但这当然行不通,因为 MainContent 不是 StaticResource。

谁能指出一种将 Text 属性绑定(bind)到加载到 MainRegion 中的 UserControl 的某些属性的方法?

最佳答案

我不认为您将能够找到一种直接绑定(bind)到区域中对象中的属性的干净方法。您可能能够做到这一点的一种方法是让指定区域中的所有 View 都从一个公共(public)接口(interface)继承,以便它们都实现相同的属性(例如,SystemName)。您可以绑定(bind)到包含该属性的路径,并使用 ValueConverter 将类型从 System.Object 更改为接口(interface)类型。

我遇到的问题是它限制了您可以放入该区域的内容,并且似乎将 shell 与其中显示的类型结合起来比我个人想要的更多。我建议采用不同的方法:由于您的状态栏是您的外壳的一部分,因此为外壳提供一个 ViewModel,其中状态栏绑定(bind)到您的属性,并使用事件来跟踪状态值何时更改。这样做的一些好处:

  • 您的事件可以发送具有您的 shell 可以绑定(bind)到的任意数量属性的任何对象。这让状态栏以外的东西也可以使用它。
  • 不与 shell 中的各种对象交互的 View 不必传输事件。这使得在区域中显示的较大组件的 subview 不会与 shell 产生不利的交互,或实现它们不需要的任何接口(interface)
  • 它是 Prism 框架中定义明确的机制,因此是分发信息的预期方式

  • 请注意,您显然可以将事件定义为您需要的任何内容 - 我只是输入了一个 Object 类型的参数,但您可能希望它更具体地满足您的整体需求。
    // 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;
    }
    }

    现在,您所要做的就是实现 IActiveAware,并在它们变为 Active 时引发事件。或者,您可以让 ViewModel 为您的 View 执行此操作(这可能更好,但需要一些额外的通信。有一些解释 here 这样做。)。
    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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com