C# 棱镜-跨区域数据绑定

C# 棱镜-跨区域数据绑定,c#,.net,wpf,xaml,prism,C#,.net,Wpf,Xaml,Prism,假设我有两个区域A和B A区: <Grid> <TextBlock Name="tba"> HAHAHA </TextBlock> </Grid> 哈哈哈 B区: <Grid> <TextBlock Text="{Binding ElementName=tba, Path=Text}"/> </Grid> 这是行不通的。解决此问题的方法是什么,因此在区域B中也会显示“哈哈哈”?您的视图

假设我有两个区域A和B

A区:

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

哈哈哈
B区:

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


这是行不通的。解决此问题的方法是什么,因此在区域B中也会显示“哈哈哈”?

您的视图模型可以通过
事件聚合器进行通信以建立连接

// 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
}
//如果两个视图模型位于不同的程序集中,则需要是公共的
内部类ThePropertyChangedEvent:PubSubEvent
{
}
内部类ViewAViewModel:BindableBase
{
公共视图视图模型(IEventAggregator事件聚合器)
{
_eventAggregator=eventAggregator;
eventAggregator.GetEvent().Subscribe(x=>TheProperty=x);
}
公共字符串属性
{
获取{return\u theProperty;}
设置
{
如果(值==\u属性)
返回;
_属性=值;
_eventAggregator.GetEvent().Publish(\u属性);
OnPropertyChanged();
}
}
#地区私人
私有只读ieventagegrator\u事件聚合器;
私有字符串\u属性;
#端区
}

ViewBViewModel
本质上是相同的(在这个简单的例子中)。

可能只有一个XAML解决方案吗?如果遍历可视化树的时间足够长,可能会有一个,但它将相当复杂和脆弱。我看不出有什么好处,真的,因为如果你想将文本块b绑定到文本块a的文本,你希望它会改变,所以无论如何它应该绑定到视图模型中的一个属性。是的,这是一个帮助我的解决方案,它在多个模块和主Shell之间建立了一个事件通信链接,并且一切正常。