如何在modelView和View之间为datacontext正确传递参数

时间:2016-02-13 00:41:10

标签: wpf mvvm datacontext

我有以下内容: - 类AccountViewModel:BaseViewModel - AccountView.xaml

我很难将参数传递给ModelView。

在主窗口中,我将它们绑在一起:

<DataTemplate DataType="{x:Type local:AccountViewModel}">
     <local:AccountView />
</DataTemplate>

在mainWindowViewModel中,我有一个操作来执行以下操作来显示帐户视图:

ChangeViewModel(new AccountViewModel(new DateTime(2016, 2, 06), new DateTime(2016, 2, 15)))

如您所见,AccountViewModel为其构造函数提供了2个参数,2个Datetime。

然后在AccountView中,我尝试通过执行以下操作来创建DataContext:

<UserControl.DataContext>
    <ObjectDataProvider ObjectType="local:AccountViewModel"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <ObjectDataProvider.ConstructorParameters>
            <sys:DateTime></sys:DateTime>
            <sys:DateTime></sys:DateTime>
        </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
</UserControl.DataContext>

无论我做什么,它都会创建另一个AccountViewModel实例。我不希望这样,我希望这个AccountView继续使用我在上面显示的命令中创建的AccountViewModel,但我也想使用绑定功能。如果可能的话,我宁愿尽量避免使用代码。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您不需要在ViewModel上创建额外的对象。当您的ViewDataTemplate DataType定义时View。它会自动传递给您的视图。

See this answer to understand DataContext here

DataContext删除您的以下代码并检查local:AccountViewModel,它将是<UserControl.DataContext> <ObjectDataProvider ObjectType="local:AccountViewModel" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <ObjectDataProvider.ConstructorParameters> <sys:DateTime></sys:DateTime> <sys:DateTime></sys:DateTime> </ObjectDataProvider.ConstructorParameters> </ObjectDataProvider>

var mime = require('mime');
var fs = require('fs');
var path = require('path');

app.route('/api/xx/download').get(function (req, res) {
    var file = __dirname + '/../../public/assets/data/demo.png';
    var filename = path.basename(file);

    var mimetype = mime.lookup(file);

    res.setHeader('Content-disposition', 'attachment; filename=' + filename);
    console.log('mimetype', mimetype);
    res.setHeader('Content-type', mimetype);

    var filestream = fs.createReadStream(file);
    filestream.pipe(res);
  });