0

我有几个UserControls是从 parent 调用的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,但我没有找到任何有趣的手册/指南,我不确定如何使用它发送信息。

为什么我需要在用户控件之间进行通信?蓝色的(例如)有一个 DataGrid。左边有一个更新按钮,所以当我按下时update,我希望数据网格将更改保存在蓝色区域。右侧区域接收一些用户信息,并打印出来。

有谁能够帮助我?

或者任何简单的例子都会非常感谢!

4

3 回答 3

0

我可以使用这篇文章中所说的来解决它:

事件聚合器

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

于 2013-01-23T16:56:17.223 回答
0

EventAggregator是 Microsoft Prism 的 WPF 消息传递系统版本还有其他以相同方式工作的消息传递系统,例如MVVM Light 的 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 更新,例如您的“红色”边后面的代码。

EventAggregator就我个人而言,起初我发现了令人困惑的基本语法,并且使用起来很烦人,因为我需要对EventAggregator无处不在的引用,所以我通常使用静态类来简化它。如果您有兴趣做类似的事情,我的博客上发布了我的静态类的代码

(此外,由于您在评论中提到学习 MVVM,我的博客上有一个简单的 MVVM 示例,您可能也会感兴趣。它是专门为像我这样难以理解一些技术性更强的 MVVM 文章的人编写的那里。)

于 2013-01-23T17:16:32.777 回答
0

让控件的绑定在需要时使用 MVVM(模型->视图模型->视图)架构以及 xaml 中的行为和触发器进行对话。

获取将驻留在您的视图(页面或窗口)上的多个控件。您的视图实例化了一个 ViewModel,它将包含获取和处理数据所需的所有业务逻辑(如果需要,可以在视图之间共享),方法是公开对象(读取类)以供模型中定义的消费使用。列表或原始数据中的任何公开数据都将通过 INotifyPropertyChanges (异步)提供,如果需要,列表可以是原始数据或 ObservableCollections 中的数据。

您的视图会将其数据上下文绑定到该视图模型。xaml 将绑定到可观察的集合和公开的属性。在模型视图的构建过程中,任务异步加载数据,让控件自己加载和处理。

由于 ViewModel 上表示的状态,在 xaml 中启用和禁用控件和按钮。例如,当 ModelView 上的布尔值变为真时,按钮会自行开启 (IsEnabled)。

通过在异步模式下使用 MVVM 以及视觉触发器和其他项目的灵活性,您的 GUI 进程可以处理这些情况,真正在 ViewModel 上没有问题。

于 2013-01-23T17:23:57.370 回答