загрузка элемента управления Silverlight с помощью пользовательского конструктора - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть страница 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;
    }

Я получаю ошибку, описанную выше в моем Mainpage.xaml.cs, когда он вызывает InitializeComponent ();method.

Я думаю, что мне, вероятно, нужно указать, чтобы clr вызывал правильный конструктор при загрузке searchwin в этой строке здесь ниже

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

Есть идеи, как это исправить?... Спасибо за ваше время.

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

.

У меня есть страница на Silverlight, на которой я загружаю контроль. Этот контроль имеет его собственная модель представления, которую я передаю файл .xaml.cs через его конструктор. Однако я получаю ошибку при компиляции. Это ошибка:

{Не найдено подходящего конструктора для типа 'MySite.Views.SearchFlyOutWin'}

Если конструктор вашего собственного элемента управления принимает некоторые параметры, вы не можете использовать этот элемент управления в XAML. В XAML каждый элемент управления должен иметь конструктор без параметра . Вот почему он показывает сообщение об ошибке {Не найдено подходящего конструктора для типа 'MySite.Views.SearchFlyOutWin'} , так как XAML-парсер ищет в вашем элементе управления конструктор без параметра , называемый SearchFlyOutWin , и ничего не найдено!

Один из вариантов - удалить параметр из конструктора, определить вашу модель в XAML как ресурс, а затем установить для него DataContext. Вот так

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

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

Надеюсь, это решит вашу проблему.

.

0 голосов
/ 26 декабря 2012

Возможно, вам потребуется установить класс viewmodel как общедоступный. Потому что, я думаю, ваш класс viewmodel будет в другом пространстве имен, кроме view.

0 голосов
/ 29 ноября 2010

Если вы посвятили себя передаче модели представления объекту в конструкторе (что я не считаю плохой вещью), я нашел единственный способ сделать это - создать объект в коде, а затемдобавить его в родительскую панель программно.Настройка привязок в коде также возможна, хотя синтаксис является более сложным, чем синтаксис 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, я бы с удовольствием посмотрел его, но пока не нашел.

...