2013-03-02 11 views
5

さてさて、これはこの質問に幾分関連している:WPF Printing multiple pages from a single View ModelMVVM +ユーザーコントロール+依存プロパティ

私はそこに与えられたアドバイスに従うことを試みたが、今私はこだわっています。

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

- ポストによると - 私が次のことを行う必要がありそうです:

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

アイデアははっきりしていますが、お互いに通知しようとすると固まってしまいます。

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"); 
} 

さてさて、私は今、いくつかの依存関係プロパティを持つユーザーコントロールを持っています:

マイユーザーコントロール(UcTest.xaml)は、依存関係プロパティを公開します。しかし、これらのプロパティはViewModelのプロパティ(表示されるもの)と完全に分離されています。

だから、基本的に私は2つの可能性ている:どのように私は今、いくつかのプロパティが変更されたことをユーザーコントロールのための私のViewModelを

  • を伝えることができますか?
  • 依存関係のプロパティを忘れて、ビューモデルに直接アクセスする可能性はありますか?

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

+0

データバインディングを使用 –

+1

これは、私のUserControlが、基本的に私のViewModelが行うべきINotifyPropertyChangedを実装する必要があることを意味します。 –

答えて

4

申し訳ございませんが、グーグルでは、これに対する「正しい」アプローチはまったくそれをしないということになります。一般的なアプローチは、MainViewModelにデータを保持し、UserControlのために追加のViewModelを使用しないことです。主な問題は、DependencyプロパティからViewModelにデータを取得する簡単なメカニズムがないことです。

印刷するために、私は今、純粋にコードで行うことに戻りました。

+0

これは、タブ項目をユーザーコントロールに分割する場合に適用されます。しかし、何度も表示されるファイルブラウザのような一般的なコントロールはどうでしょうか? – bytecode77

+0

@Tom L.あなたの状況では、私が思い付くことができた最高のは、ユーザーコントロールのデータコンテキストを設定しないでください。その後、Windows上で渡されたプロパティをDPから変数に保存し、コンテキストをあなたのVMの新しいインスタンス次に、VMに適切なプロパティを設定し、続行します。それは理想的ではありませんが、仕事を終わらせます。バインディングを取得するには、どのコンテキストで指定できるDPのメタデータが必要です。 –

5

通常はbind、ViewModelプロパティに対するUserControlのプロパティです。双方向バインディングは、ViewModelからViewへ、またはその逆の両方向で両方向で機能します。

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

は直接あなたは、単にのViewModel型にUserControlのDataContextプロパティを唱え、上記の例でのViewModelオブジェクトにアクセスします。 DataContextはMainWindowから継承されます。

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

か、リソースディクショナリ内のリソースとしてのViewModelのインスタンスを作成して割り当てることがあります。

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

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

<local:UcTest DataContext="{StaticResource MyUserControlViewModel}" 
       SpecialText="{Binding MyViewModelProperty, Mode=TwoWay}"/> 
+0

私はあなたを誤解するかもしれないと思います。問題は、私がバインドしたい独自のViewModelがUserControlにあるということです。 また、MainViewModelでプロパティを保持し、独自のViewModelを使用せずにUserControlを使用する方がよいと思いますか? –

+0

これは、アプリケーションの設計によって異なります。どちらも有効な解決策です。 UserControlのDataContextプロパティを直接割り当てることもできます。 – Clemens

+1

こんにちは、私はこれを本当に理解していません。あなたは例を投稿してもよろしいですか? UserControlのDataContextをUserControlViewModelに変更すると、UserControlがこれらのプロパティについて知りませんので、これ以上変数を割り当てることができません。 SpecialTextがDependencyPropertyでない場合、どのように「SpecialText」に何かを割り当てることができますか? –

関連する問題