2016-09-16 14 views
1

をViewModelにする観点からパラメータを渡す:WPFプリズム - 私はこのようなユーザーコントロール含まビュー(MYVIEW)作成

<StackPanel> 
    <ctrl:ViewDialog DataContext="{Binding CtrlViewDialog}" Message="Hello" Name="ctrlViewDialog" >      
</ctrl:ViewDialog> 

ビューの背後にあるコード:

public MyView() 
     { 
      InitializeComponent(); 
      var _message = ctrlViewDialog.Message; 
     } 

     [Dependency] 
     public MyViewViewModel ViewModel 
     { 
      get 
      { 
       return (MyViewViewModel)this.DataContext; 
      } 
      set 
      { 

       this.DataContext = value; 
      } 
     } 

ビューモデルMyViewViewModelは次のとおりです。

public MyViewViewModel() 
     {   

      ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message); 
     } 

含まれ、ユーザーコントロール(viewdialogに)の背後にあるコードは次のとおりです。

private string message; 
     public string Message 
     { 
      get { return message; } 
      set { message = value; } 
     } 


     public ViewDialog() 
     { 
      InitializeComponent(); 
     } 

がどのように私は私がしようとしますViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message);

+0

これはあなたがやりたいことですか? (MyViewViewModel)this.DataContextを使用します。通常、あなたは正しいことをしていない兆候です。プリズムのDIには何を使用していますか? –

+0

Ok Filip、(MyViewViewModel)this.DataContextを削除できました。私はMessage = "Hello"(xaml)をビューからviewmodelに渡したいと思います。他の方法はありますか? –

答えて

2

[OK]をインスタンスに渡すためにMyViewViewModelするMYVIEWの"_message"パラメータを渡すことができますあなたが実際に尋ねた木の質問に答えてください。 最初はc#に関連しています。あなたはこれができますか?

public MyViewViewModel() 
{  
    ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message); 
} 

いいえいいえコンストラクタは、プロパティを入力する前に常に実行されます。

秒この値を渡すことができますかWPFを使用してビューモデルに表示しますか? はい。これはコンストラクタでも実行できますが、これにはもっと多くのコードが必要です。コントロールを簡単に読み込むことができます。今

<UserControl 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:prism="http://prismlibrary.com/" 
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
      xmlns:vm="clr-namespace:PrismTest.ViewModels" 
      xmlns:view="clr-namespace:PrismTest.Views" 
      x:Class="PrismTest.Views.TestView" 
      prism:ViewModelLocator.AutoWireViewModel="True"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding Message, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type view:TestView}}}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    <Grid> 
     <StackPanel> 
      <TextBlock Text="{Binding Message, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type view:TestView}}}"/> 
      <TextBlock Text="{Binding Message}"/> 
     </StackPanel> 
    </Grid> 
</UserControl> 

コマンド

private ICommand loadedCommand = new DelegateCommand<string>(text => 
     { 
      MessageBox.Show(text); 
     }); 
     public ICommand LoadedCommand { get { return loadedCommand; } } 

そして、あなたは、プリズムで行う必要があります。この何ですか?うまくパラメータを渡すはい。このViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message);を行うと、この

(MyViewViewModel)this.DataContext; 

NO!プリズム依存性注入を使用したい場合は、最も重要な部分です。あなたはthisthisを見たいかもしれません。

+0

Filipコンストラクタ内の "Message"は、コントロールのプロパティではありません。同じ名前を使用して申し訳ありません。あなたが提案したコードの残りの部分は正常に動作しています。素晴らしい解決策です –

+0

私は助けてうれしいです。 Massageプロパティがsetterを持たない読み取り専用のプロパティである場合にのみ指摘する 'Massage {get {return" SOME FIX VALUE ";新しい 'ViewModel(){Message =" Some Value "}'でコンストラクタを使用することができます。 –

関連する問題