使用自定义构造函数加载silverlight控件

时间:2010-11-29 15:57:04

标签: silverlight xaml mvvm ioc-container

我有一个Silverlight页面,我正在加载一个控件。这个控件有自己的viewmodel,我通过它的构造函数传递给.xaml.cs文件。但是我在编译时遇到错误。这是错误:

{No matching constructor found on type 'MySite.Views.SearchFlyOutWin'}

我的主页引用了像这样的'SearchFlyOutWin'

xmlns:part="clr-namespace:MySite.Views;assembly=MySite"

在我的mainpage.xaml中,我试图像这样加载控件

<part:SearchFlyOutWin x:Name="searchFlyOutWin" Visibility="{Binding Converter={StaticResource BooleanToVisibilityConverter}, Path=IsSearchVisible}" />

我的SearchFlyOutWin.xaml.cs中的构造函数就像这样

    public SearchFlyOutWin(ISearchFlyoutViewModel viewmodel)
    {
        InitializeComponent();
        DataContext = viewmodel;
    }

当我调用InitializeComponent()时,我在Mainpage.xaml.cs中得到了上述错误;方法

我想我可能需要在下面的这行中加载searchwin时指示clr调用正确的构造函数

<part:SearchFlyOutWin x:Name="searchFlyOutWin" Visibility="{Binding Converter={StaticResource BooleanToVisibilityConverter}, Path=IsSearchVisible}" />

有关如何纠正此问题的任何想法? ...谢谢你的时间。

3 个答案:

答案 0 :(得分:2)

  

我有一个银色的页面,我   我正在加载一个控件。这个控件有   它传递给我自己的viewmodel   .xaml.cs文件通过它   构造函数。但是我收到了一个错误   编译时这是错误:

     

{在类型上找不到匹配的构造函数   'MySite.Views.SearchFlyOutWin'}

如果你自己的控件的构造函数需要一些参数,那么就不能在XAML中使用这个控件。在XAML中,每个控件都必须具有没有参数的构造函数。这就是为什么它显示错误消息 {在类型'MySite.Views.SearchFlyOutWin'} 上找不到匹配的构造函数,因为 XAML解析器在您的搜索结构中没有参数控件名为 SearchFlyOutWin ,它找不到!

一个方面是从构造函数中删除参数,并在XAML中将Model定义为资源,然后将DataContext设置为它。像这样,

<Window.Resources>
        <local:SearchFlyoutViewModel x:Key="model"/>
</Window.Resources>

<part:SearchFlyOutWin DataContext="{StaticResource model}"/>

希望,它解决了你的问题。

答案 1 :(得分:0)

如果您致力于将viewmodel传递给构造函数中的对象(我认为这不是一件坏事),我发现这样做的唯一方法是在代码中创建对象然后以编程方式将其添加到其父面板。虽然语法比XAML语法更复杂,但也可以在代码中设置绑定。代码可能类似于:

SearchFlyOutWin searchFlyOutWin = new SearchFlyOutWin(viewModel);
Binding b = new Binding("");
b.Source = IsSearchVisible;
b.Converter = new BooleanToVisibilityConverter();
searchFlyOutWin.SetBinding(SearchFlyOutWin.VisibilityProperty, b);
SearchFlyOutWinParentPanel.Children.Add(searchFlyOutWin);

其中SearchFlyOutWinParentPanel是一些可以接受子项的面板。如果在XAML中有另一种方法可以做到这一点,我很乐意看到它,但我还没有找到它。

答案 2 :(得分:0)

您可能需要将viewmodel类设置为public。 因为我猜你的viewmodel类将在视图之外的另一个命名空间中。