我从父UserControls
调用了几个Application
。在我的主应用程序中,我有一个ContentControl
来填充我应用的几个区域:
黑色区域:主窗口
红色区域:左右ContentControl
蓝色区域:主要ContentControl
代码会查找每个代码:
<!-- Main container ContentControl -->
<ContentControl Name="ContentMain" Style="{StaticResource animatedContent}" Grid.Column="3" Grid.Row="2" Grid.RowSpan="8" Width="Auto" Opacity="1" Background="Transparent" >
</ContentControl>
<!-- Left container ContentControl -->
<ContentControl Name="ContentLeftMenu" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="2" Grid.RowSpan="8" Width="Auto" Opacity="1" Background="Transparent" >
</ContentControl>
.....
每次我想要更改主要内容时,我都会在App
UserControls
<UserControl x:Class="F7Demo.Interfaces.F7AddUser"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" >
<UserControl.Resources>
<ResourceDictionary Source="../Styles/F7Style.xaml" />
</UserControl.Resources>
<Grid Margin="5,5,5,10" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25" />
<ColumnDefinition Width="728*" />
<ColumnDefinition Width="25" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="25" />
<RowDefinition Height="35" />
<RowDefinition Height="526*" />
</Grid.RowDefinitions>
<Border
Opacity="0.7"
Background="{StaticResource DarkGradient}"
CornerRadius="15" Grid.RowSpan="3" Grid.ColumnSpan="3">
<Border.Effect>
<DropShadowEffect
BlurRadius="5"
Color="#877b77"
Opacity="100"
ShadowDepth="5"
Direction="-50" />
</Border.Effect>
</Border>
<Label Grid.Row="1" Grid.Column="1" Height="28" Name="labelWelcomeMessage" VerticalAlignment="Top" Grid.ColumnSpan="3" FontStretch="Expanded" />
<TextBlock Name="textBlockMainContent" Grid.Row="2" Grid.Column="1" TextWrapping="Wrap"></TextBlock>
</Grid>
上创建。其中一个(不复制所有这些)看起来像这样:
UserControl
但每个Event Aggregator
需要与其他人交流。我搜索过,我发现解决方案是使用update
,但我没有找到任何有趣的手册/指南,而且我不确定如何发送信息。
为什么我需要在用户控件之间进行通信?蓝色的(例如)有一个DataGrid。左边有一个更新按钮,所以当我按下{{1}}时,我希望数据网格保存蓝色区域的更改。右侧区域接收一些用户信息,然后打印出来。
有人能帮助我吗?
或者真的要感谢任何简单的例子!!
答案 0 :(得分:0)
答案 1 :(得分:0)
EventAggregator是Microsoft Prism的WPF消息传递系统版本。还有其他消息系统以相同的方式工作,例如MVVM Light's Messenger,或者您可以创建自己的消息系统。
但他们所有人都以类似的方式工作。您的应用程序的任何部分都可以广播消息,以及您的应用程序的任何部分并订阅接收消息。
以下是Microsoft Prism EventAggregator
的基本语法:
// Subscribe
eventAggregator.GetEvent<UpdateDataGridMessage>().Subscribe(UpdateDataGrid);
void UpdateDataGrid()
{
// Update DataGrid here
}
// Broadcast
eventAggregator.GetEvent<UpdateDataGridMessage>().Publish();
因此,包含DataGrid
的表单后面的代码可以订阅接收UpdateDataGridMessage
类型的任何消息,并在收到此类消息时更新DataGrid
。然后,您的应用程序的任何部分都可以广播UpdateDataGridMessage
以触发DataGrid更新,例如“Red”端背后的代码。
就个人而言,我发现EventAggregator
的基本语法一开始很容易混淆,并且因为我需要在任何地方都需要EventAggregator
的引用而烦恼,所以我通常使用静态类来使这更简单。如果你对做类似的事情感兴趣,我有the code for my static class posted on my blog。
(另外既然你在评论中提到学习MVVM,我也有一个你可能感兴趣的Simple MVVM example on my blog。它是专门为像我这样的人写的,很难理解一些技术性较强的MVVM那里的文章。)
答案 2 :(得分:0)
让控件的绑定使用MVVM(Model-&gt; ViewModel-&gt; View)架构以及xaml中的行为和触发器进行谈话。
将您的多个控件放在您的视图(页面或窗口)上。您的视图实例化一个ViewModel,它将容纳获取和处理数据所需的所有业务逻辑(如果需要,可以在视图之间共享),方法是公开模型中定义的消耗对象(读取类)。列表或原始数据中的任何公开数据都将通过INotifyPropertyChanges(异步)提供(如果需要,可以是原始数据),也可以是ObservableCollections(如果需要)。
您的视图会将其datacontext绑定到该ViewModel。 xaml将绑定到可观察集合和公开属性。在构建ModelView期间,任务以异步方式加载数据,让控件加载自己并进行处理。
由于ViewModel上显示的状态,在xaml启用和禁用控件和按钮。例如,当ModelView上的布尔值变为true时,该按钮会自动打开(IsEnabled)。
通过使用视觉触发器和其他项目的灵活性,以非自然模式使用MVVM,您的GUI进程可以处理这些情况,实际上在ViewModel上没有任何问题。