在Silverlight中从xaml传递参数到构造函数

时间:2013-03-08 15:15:43

标签: c# silverlight

我从启用Silverlight的WCF服务获取数据并将其绑定到DataGrid ItemSource。但我的ViewModel的构造函数正在获取一个参数。我正在使用MVVM。我希望从xaml传递参数到构造函数。 我必须在这里添加什么? 这是xaml中我正在设置页面的DataContext的部分。

<navigation:Page.DataContext>
    <vms:StudentViewModel />
</navigation:Page.DataContext>

这是类的构造函数:

 public StudentViewModel(string type)
    {
        PopulateStudents(type);
    }

此外,还有错误:

  

类型'StudentViewModel'不能用作对象元素,因为它   不公开或不定义公共无参数构造函数或   一种类型转换器。

1 个答案:

答案 0 :(得分:5)

您只能使用默认的无参数构造函数在WPF中实例化对象,如错误消息所示。因此,最好的办法是让'Type'成为DependencyProperty并为其设置绑定,然后在设置时调用PopulateStudents()方法。

public class StudentViewModel : DependencyObject
{
    // Parameterless constructor
    public StudentViewModel()
    {
    }

    // StudentType Dependency Property
    public string StudentType
    {
        get { return (string)GetValue(StudentTypeProperty); }
        set { SetValue(StudentTypeProperty, value); }
    }

    public static readonly DependencyProperty StudentTypeProperty =
        DependencyProperty.Register("StudentType", typeof(string), typeof(StudentViewModel), new PropertyMetadata("DefaultType", StudentTypeChanged));

    // When type changes then populate students
    private static void StudentTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var studentVm = d as StudentViewModel;
        if (d == null) return;

        studentVm.PopulateStudents();
    }

    public void PopulateStudents()
    {
        // Do stuff
    }

    // Other class stuff...
}

的Xaml

<navigation:Page.DataContext>
    <vms:StudentViewModel StudentType="{Binding YourBindingValueHere}" />
</navigation:Page.DataContext>