Wpf Prism -将参数从视图传递到视图模型

本文关键字:视图 模型 Prism 参数 Wpf | 更新日期: 2023-09-27 18:07:28

我创建了一个视图(MyView),其中包含一个UserControl,如下所示:

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

包含的UserControl (ViewDialog)后面的代码是:

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

        public ViewDialog()
        {
            InitializeComponent();
        }

我如何将MyView的"_message"参数传递给MyViewViewModel以将其传递给实例ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message);

Wpf Prism -将参数从视图传递到视图模型

好吧,我试着回答你实际问的那三个问题。第一个与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; } }

这是你在prism中应该做的吗?是的,传递参数。做这个ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message);和这个

(MyViewViewModel)this.DataContext;

不! !如果你想使用prism,依赖注入是最重要的部分。你可能想看看这个和这个