0

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. それらの1つ(すべてをコピーしないため)は次のようになります。

<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

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 (Model->ViewModel->View) アーキテクチャと xaml での動作とトリガーを使用して、コントロールのバインディングで会話を行います。

ビュー (ページまたはウィンドウ) に常駐する複数のコントロールを取得します。ビューは、モデルで定義された消費用のオブジェクト (読み取りクラス) を公開することによって、データを取得して処理するために必要なすべてのビジネス ロジック (必要に応じてビュー間で共有できます) を格納する ViewModel をインスタンス化します。リストまたは生データのいずれかで公開されたデータは、INotifyPropertyChanges を介して (非同期に) 提供され、必要に応じてリストを生にすることも、必要に応じて ObservableCollections にすることもできます。

ビューは、そのデータ コンテキストをその ViewModel にバインドします。xaml は、監視可能なコレクションと公開されたプロパティにバインドします。ModelView の構築中に、タスクにデータを非同期的にロードさせ、コントロールがそれ自体をロードして処理できるようにします。

ViewModel で表される状態により、xaml でコントロールとボタンを有効または無効にします。ModelView のブール値が true になったときにオン (IsEnabled) になるボタンなど。

視覚的なトリガーやその他の項目の柔軟性を備えた非同期モードで MVVM を操作することにより、GUI プロセスは状況を処理できます。ViewModel 上では問題なく処理できます。

于 2013-01-23T17:23:57.370 に答える
0

この投稿で言われていることを使用して解決できました:

EventAggregator

WPFを使用している場合、これがベストプラクティスではないことはわかっていますが、MVCを使用したい、または使用する必要があるすべての人にとっては機能します;)

于 2013-01-23T16:56:17.223 に答える