2016-09-16 151 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”中使用它}}'总是先运行构造函数,然后运行属性设置器。 –