C# 棱镜-跨区域数据绑定
假设我有两个区域A和B A区: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中也会显示“哈哈哈”?您的视图
<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之间建立了一个事件通信链接,并且一切正常。