【问题标题】:Prism - Cross Region DataBindingPrism - 跨区域数据绑定
【发布时间】:2016-08-04 12:53:58
【问题描述】:

假设我有 2 个区域 A 和 B。

A区:

<Grid>
    <TextBlock Name="tba"> HAHAHA </TextBlock>
</Grid>

B区:

<Grid>
    <TextBlock Text="{Binding ElementName=tba, Path=Text}"/>
</Grid>

这不起作用。解决这个问题的解决方法是什么,所以在区域 B 中也会显示“哈哈哈”?

【问题讨论】:

    标签: c# .net wpf xaml prism


    【解决方案1】:

    您的视图模型可以通过EventAggregator 相互通信以建立连接。

    // needs to be public if the two view models live in different assemblies
    internal class ThePropertyChangedEvent : PubSubEvent<string>
    {
    }
    
    internal class ViewAViewModel : BindableBase
    {
        public ViewAViewModel( IEventAggregator eventAggregator )
        {
            _eventAggregator = eventAggregator;
            eventAggregator.GetEvent<ThePropertyChangedEvent>().Subscribe( x => TheProperty = x );
        }
    
        public string TheProperty
        {
            get { return _theProperty; }
            set
            {
                if (value == _theProperty)
                    return;
                _theProperty = value;
                _eventAggregator.GetEvent<ThePropertyChangedEvent>().Publish( _theProperty );
                OnPropertyChanged();
            }
        }
    
        #region private
        private readonly IEventAggregator _eventAggregator;
        private string _theProperty;
        #endregion
    }
    

    ...ViewBViewModel 本质上是一样的(在这个简单的例子中)。

    【讨论】:

    • 是否有可能只有 XAML 解决方案?
    • 可能有一个,如果你遍历可视化树足够长的时间,但它会相当复杂和脆弱。而且我真的看不出有什么好处,因为如果你想将文本块 b 绑定到文本块 a 的文本,你希望它会改变,所以无论如何它应该绑定到视图模型中的属性。
    • 是的,这是对我有帮助的解决方案,在多个模块和主 Shell 之间建立了一个事件通信链接,一切正常。
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多