【问题标题】:loading a silverlight control with a custom constructor使用自定义构造函数加载 Silverlight 控件
【发布时间】:2011-05-17 08:51:50
【问题描述】:

我有一个 silverlight 页面,我正在其中加载一个控件。这个控件有它自己的视图模型,我通过它的构造函数将它传递给 .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}" />

关于如何纠正这个问题的任何想法? ...感谢您的宝贵时间。

【问题讨论】:

    标签: silverlight xaml mvvm ioc-container


    【解决方案1】:

    .

    我有一个 silverlight 页面,我在其中 我正在加载一个控件。这个控件有 我传入的它自己的视图模型 .xaml.cs 文件通过其 构造函数。但是我收到一个错误 编译时。这是错误:

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

    如果您自己的控件的构造函数带有一些参数,那么您不能在 XAML 中使用该控件。在 XAML 中,每个控件都必须有没有参数的构造函数。这就是为什么它显示错误消息 {No matching constructor found on type 'MySite.Views.SearchFlyOutWin'},因为 XAML 解析器在您的控件名为 SearchFlyOutWin,但没有找到!

    一种解决方案是从构造函数中删除参数,并在 XAML 中将您的模型定义为资源,然后将 DataContext 设置为它。像这样,

    <Window.Resources>
            <local:SearchFlyoutViewModel x:Key="model"/>
    </Window.Resources>
    
    <part:SearchFlyOutWin DataContext="{StaticResource model}"/>
    

    希望,它可以解决您的问题。

    .

    【讨论】:

    • 不是直接的。我的视图模型也有一个构造函数。尝试加载 veiw 模型时,它开始给出未找到构造函数的错误。我删除了参数并将其设置为默认 const 以解决该问题。但现在我有另一个问题。我想将此控件默认设置为不可见,并且仅当我更改为位于 mainpage.xaml 上的列表框中的特定值时才可见。在 mainpage.xaml 中或以编程方式在 mainpage.xaml.cs 中设置 UC 的数据上下文会导致控件始终可见。我现在藏不住了。有什么想法吗?
    【解决方案2】:

    如果您致力于将视图模型传递给构造函数中的对象(我认为这不是一件坏事),我发现这样做的唯一方法是在代码中创建对象,然后以编程方式将其添加到其父面板。也可以在代码中设置绑定,尽管语法比 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 中有另一种方法可以做到这一点,我很乐意看到它,但我还没有找到它。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-10-27
        • 2020-04-22
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多