2016-09-16 128 views
1

我創建的視圖(MyView的)其中,I包括這樣的用戶控件:WPF棱鏡 - 從視圖傳遞參數到視圖模型

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

我怎麼能忽略MyView的的"_message"參數,以MyViewViewModel將它傳遞給實例ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message);

+0

你確定這是你想要做的嗎?使用(MyViewViewModel)this.DataContext;在視圖中通常是一個標誌,你沒有把事情做對。你在棱鏡中使用了什麼? –

+0

Ok Filip,我可以刪除(MyViewViewModel)this.DataContext;但我想從視圖傳遞Message =「Hello」(xaml)到viewmodel。有沒有其他方法? –

回答

2

好,我會盡力回答你實際詢問的樹問題。 首先與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; 

不!如果你想使用棱鏡依賴注入是最重要的部分。你可能想看看thisthis

+0

Filip構造函數中的「消息」不是控件的屬性,對於使用相同的名稱感到抱歉;)。您建議的其他代碼工作正常。是一個很好的解決方案 –

+0

很高興我能提供幫助。只要指出,如果按摩屬性是一個只讀的財產,沒有setter'按摩{得到{返回「一些固定價值」; }}'你可以在構造函數中使用它,在新的ViewModel(){Message =「Some Value」中使用它}}'總是先運行構造函數,然後運行屬性設置器。 –