1

この質問に簡単に答えられることを願っていますが、何日も経ち、UserControls 間でデータを共有する方法がわかりませんでした。

以下のページには 2 つのタブがあり、それらのソースが参照されています。また、ViewModel 内のコマンドにアクセスする [開始] というラベルの付いたボタンもあります。

私が抱えている問題は、データが実際にタブ内にあることです。同じ ViewModel を使用するように設定し、それぞれが ViewModel の独自のインスタンスを作成して、データが [スタート] ボタンに表示されないようにします。それ以来、それがうまくいくことを願っています。

これはかなり単純なプログラムであり、単一の要素のみを含む 3 つの個別の ViewModel を用意する必要があるとは思えませんが、おそらくそれが必要なことです。全体として、開始ボタンを押したときに、すべてのデータをすべて収集し、外部エンティティに送信する必要があります。

これが以前に尋ねられた質問である場合は申し訳ありませんが、私はC#に比較的慣れていないため、何を求めているのか完全にはわかりません. 前もって感謝します!

<UserControl
             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" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:mui="http://firstfloorsoftware.com/ModernUI"
             x:Class="DeployWiz.Pages.Config"
             mc:Ignorable="d" 
             xmlns:local="clr-namespace:DeployWiz.ViewModel"
             d:DesignHeight="356.978" d:DesignWidth="333.582">
    <Grid Style="{StaticResource ContentRoot}" Margin="16,28,16,5" >
        <Grid.DataContext>
            <local:ComputerViewModel/>
        </Grid.DataContext>
        <mui:ModernTab x:Name="tabList" Layout="List" SelectedSource="/Views/ComputerView.xaml" Margin="0,0,0,40">
            <mui:ModernTab.Links>
                <mui:Link DisplayName="Settings" Source="/Views/ComputerView.xaml" />
                <mui:Link DisplayName="Applications" Source="/Views/ApplicationView.xaml" /> 
            </mui:ModernTab.Links>
        </mui:ModernTab>
        <Button Content="Start" HorizontalAlignment="Center" Margin="0,0,0,5" VerticalAlignment="Bottom" Width="75" Command="{Binding Path=StartTask}"/>
    </Grid>
</UserControl>
4

3 に答える 3

1

私の理解によれば、私はそれを次のように実装します-

MainWindowViewModel -

  • ComputerViewModel の監視可能なコレクションを持つ。
  • コレクション内のアイテムを使用して変更などをコミットする StartTask コマンドがあります。つまり、すべてのタブのデータが含まれます。

メインウィンドウ -

  • タブの作成を担当するウィンドウ。
  • MainWindowViewModel の ComputerViewModel のコレクションを使用してタブを動的に作成します (DataTemplate などを使用できます)。
  • 各タブはユーザーが持っている UserControl を使用します ([スタート] ボタンを除く)。UserControl は DataContext として ComputerViewModel を保持します。
  • MainWindowViewModel の StartTask コマンドに [スタート] ボタンをバインドします。

ComputerViewModel -

  • StartTask コマンドは必要ありません (ComputerViewModel 固有のタスクを実行することが想定されている場合を除き、その場合は適切な名前に変更する必要があります)。

このアプローチの利点 -

  • タブの作成は動的になり、さらにタブを追加する必要がある場合に自動的に機能します (コンピューター)
  • MainWindowViewModel を簡単にアップグレードして、タブの削除/追加などのより多くの機能をサポートできます。
  • タブ間のデータ受け渡しなどを行う必要がないため、メンテナンスが容易です。

ご不明な点やご不明な点がございましたら、お気軽にお問い合わせください。

于 2014-01-09T07:25:58.730 に答える
0

一貫性を保つ必要があると思います。各 View/UserControl のデータ処理の責任を異なる ViewModel に分散することにした場合は、データを外部エンティティに渡すときに同じ方法を適用する必要があります。データの受け渡しを担当する各 ViewModel。これらのコントロールの外にボタンを配置しても問題ありません。ビューモデル間で通信するためのベスト プラクティスとしてMediator パターンがあります。そうすれば、ボタンのビューモデルから各コントロールのビューモデルにメッセージを送信できます。ボタンからメッセージを受信したら、外部エンティティにデータを渡すように指示できます。

「viewmodels wpf 間の通信」は、ここで問題を検索するためのキーワードです。MVVM Light を使用する場合、メッセージの送信とメッセージのサブスクライブは、ここに示すように簡単です。Calliburn や Prism などの他の主要な MVVM フレームワークにも含まれています。それ以外の場合は、Mediator パターンの単純な実装を検索できます (多くの人が実装していると思います。コードを使用できます)。

于 2014-01-09T04:29:34.590 に答える