控件WPF之间通信的最佳方式

时间:2013-01-23 15:31:55

标签: wpf wpf-controls

我从父UserControls调用了几个Application。在我的主应用程序中,我有一个ContentControl来填充我应用的几个区域:

enter image description here

黑色区域:主窗口

红色区域:左右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}}时,我希望数据网格保存蓝色区域的更改。右侧区域接收一些用户信息,然后打印出来。

有人能帮助我吗?

或者真的要感谢任何简单的例子!!

3 个答案:

答案 0 :(得分:0)

我可以使用这篇文章中的内容解决它:

EventAggregator

我知道如果我们使用WPF,这不是最佳做法,但对于每个想要或应该使用MVC的人来说,它都有效;)

答案 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上没有任何问题。