5

了解しました。これは、この質問にいくらか関連しています。WPF単一のビューモデルから複数のページを印刷する

私はそこで与えられたアドバイスに従おうとしましたが、今は行き詰まっています。

私のアプリケーションはMainView.xamlと適切なMainViewViewModel.csを使用しており、バックグラウンドでMVVMLightを使用しています。

今-投稿によると-私は次のことをしなければならないようです:

  • ユーザーコントロールを作成する
  • ユーザーコントロールからいくつかのプロパティを公開する
  • ビューモデルにこれらのプロパティが表示されていることを確認してください

アイデアは明確ですが、お互いに通知しようとすると行き詰まります。

私のユーザーコントロール(UcTest.xaml)は、依存関係プロパティを公開しています。

public string SpecialText
{
    get { return (string)GetValue(SpecialTextProperty); }
    set
    {
        SetValue(SpecialTextProperty, value);

    }
}

// Using a DependencyProperty as the backing store for SpecialText.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty SpecialTextProperty =
    DependencyProperty.Register("SpecialText", typeof(string), typeof(UcTest), new PropertyMetadata(new PropertyChangedCallback(SpecialTextChangedPropertyCallback)));

private static void SpecialTextChangedPropertyCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    // Do something
    Debug.WriteLine("Ffgdgf");
}

了解しました。これで、いくつかの依存関係プロパティを持つユーザーコントロールができました。ただし、これらのプロパティは、私のViewModelプロパティから完全に分離されています(これらは表示されるプロパティです)。

つまり、基本的に2つの可能性があります。

  • 一部のプロパティが変更されたことをUserControlのViewModelに伝えるにはどうすればよいですか?
  • 依存関係のプロパティを忘れて、ビューモデルに直接アクセスする可能性はありますか?

追加情報#1:私がここでやろうとしていることの(簡単な)例をアップロードしました:サンプルプロジェクト。MainViewViewModelからUserControl1のラベルの値を(UserControl1のViewModelのバインディングプロパティを介して)変更したいと思います。

4

2 に答える 2

5

さて、何時間もグーグルで調べた後、これに対する「正しい」アプローチは、まったく行わないことのようです。一般的なアプローチは、データを MainViewModel に保持し、UserControl に追加の ViewModel を使用しないことです (これは少しわかりますが、あまり良くありません)。主な問題は、データを Dependency プロパティから ViewModel に取得する簡単なメカニズムがないことです。

印刷については、純粋にコードで行うことに戻りました。

于 2013-03-05T14:56:12.680 に答える
5

通常は、UserControl のプロパティを ViewModel プロパティにバインドします双方向バインディングは、ViewModel から View へ、およびその逆方向で、両方向で機能します。

<Window x:Class="TestApplication.MainWindow" ...>
    <Window.DataContext>
        <local:MyViewModel/>
    </Window.DataContext>
    <Grid>
        <local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
    </Grid>
</Window>

DataContext上記の例で ViewModel オブジェクトに直接アクセスするには、UserControl のプロパティを ViewModel 型にキャストするだけです。DataContext は MainWindow から継承されます。

var viewModel = DataContext as MyViewModel;
var property = viewModel.MyViewModelProperty;

もちろん、特別な ViewModel インスタンスを UserControl の に直接割り当てることもできますDataContext

<local:UcTest SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
    <local:UcTest.DataContext>
        <local:UserControlViewModel/>
    </local:UcTest.DataContext>
</local:UcTest>

または、ViewModel インスタンスをリソース ディクショナリのリソースとして作成し、このように DataContext を割り当てることもできます

<local:UcTest DataContext="{StaticResource MyUserControlViewModel}"
              SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/>
于 2013-03-02T15:50:41.417 に答える