Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как найти шаблон за пределами корневого элемента 
V
    Опции темы
dzaraev
Дата 27.2.2013, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Мне нужно создать примитивную инфраструктуру для открытия окон. Поэтому необходимо создать окно, умеющее показывать любой объект.
Независимо от того, программно или через XAML задается окно, я сталкиваюсь с принципиальной проблемой автоматического поиска шаблона, для отображения содержимого.

Например, есть окно:
Код

<Window x:Class="Somewhere.View.CommonWindow"
        x:Name="window"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        >
    <ContentPresenter 
        DataContext="{Binding DataContext, ElementName=window}"
        Content="{Binding DataContext, ElementName=window}"/>    
</Window>


Соответственно, есть код, который создает и настраивает окно на отображение определенного объекта:
Код

void AddWindow(MyClass myViewModel)
{
    var window = new CommonWindow();
    window.DataContext = myViewModel;
    window.Show();
}


И где-то недалеко в XAML лежит типизированный шаблон:
Код

<DataTemplate DataType="{x:Type vm:MyClass}">
            <v:MyClassView />
</DataTemplate>


Проблема в том, что данный ContentPresenter не сможет найти указанный типизированный шаблон через дерево элементов, т.к. Window.Parent == null. Единственный вариант, который я вижу - это помещать такие шаблоны в ресурсы приложения (туда поиск конечно дойдет), но это неприемлемо, т.к. существуют разные представления для разных случаев.

Буду рад любым идеям smile 
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
Flap
Дата 28.2.2013, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



я у себя в проекте сделал простое окно с фреймом:
Код

            <Frame NavigationUIVisibility="Hidden"
                Background="Transparent"
                Source="views/Login.xaml" Name="frame"                
                >                
            </Frame>


И теперь, когда мне надо показать в нем что-то другое, делаю что-то типа такого:
Код

     NavigationService.Navigate( new ProjectView(_projects.SelProject));

В данном случае, ProjectView - это страница WPF.

В твоем случае, у тебя будет некое стандартное окно с фреймом.
А класс, который ты передашь в это окно, будет иметь ссылку на свою вьюху.


Это сообщение отредактировал(а) Flap - 28.2.2013, 08:17
PM MAIL   Вверх
dzaraev
Дата 28.2.2013, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Цитата(Flap @  28.2.2013,  08:15 Найти цитируемый пост)
В твоем случае, у тебя будет некое стандартное окно с фреймом.
А класс, который ты передашь в это окно, будет иметь ссылку на свою вьюху.

У меня приложение строится по шаблону MVVM, диалог с пользователем инициируется на уровне ViewModel, а в описанном тобой случае работа происходит на уровне View. Чтобы открывать окна из View необходимо использовать события или мессенджинг между View и ViewModel - это возможно в MVVM, но крайне неудобно и громоздко при большом количестве диалогов, вызываемых в разных местах. :(
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
Flap
Дата 1.3.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Для вызова диалога из ViewModel обычно используют некий интерфейс IDialogService. Экземпляр объекта, реализующий этот диалог, передают в конструктор ViewModel.
Примерно так:
Код

public interfave IDialog
{
   bool? Show();
   ViewModelBase Data{set;get;}
}


public class MyDialog: IDialog
{
   public ViewModelBase Data{set;get;}

   public Show()
   {
      MyDialogWindow dlg = new MyDialogWindow(); <<<<--- вот это окно WPF
      dlg.DataContext = (MyViewModel)Data;
      return dlg.ShowDialog();
   }
}

public class MyViewMode()
{
   protected IDialog _dialog;
   public MyViewModel(IDialog aDlg)
   {
      _dialog = aDlg;
   }

   public Какая-то команда
   {
      if( _dialog.Show() == true )
      {
         //делаем что-нибудь с введеными данными.
         MyViewModel data = (MyViewModel)_dialog.Data;
      }
   }



PM MAIL   Вверх
dzaraev
Дата 1.3.2013, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Сегодня реализовал подобную схему, только не передавая диалог в модель, а через сервис(синглтон). Несмотря на то, что синглтоны я не люблю, более легкого в поддержке и чистого решения я не нашел. Передавать интерфейс в конструкторе - слишком накладно, т.к. с ним начинают связываться даже те ViewModel классы, которым он не нужен (чтобы обеспечить инфраструктуру), а это в свою очередь - больше неоправданных зависимостей.

По сабжу - ответ скорее всего таков - никак. Т.к. окно - корневой элемент  и фреймворк шлет на фиг при попытке сделать его чьим-нибудь чайлдом :(

Все равно спасибо за участие, тему считаю закрытой. smile 

--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
Flap
Дата 1.3.2013, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



>>По сабжу - ответ скорее всего таков - никак. Т.к. окно - корневой элемент  и фреймворк шлет на фиг при попытке сделать его чьим-нибудь чайлдом :(
По этому поводу я написал в первом свое сообщении.
Размести на главном окне Frame и пихай туда Page. Page на такую манипуляцию реагирует нормально.
PM MAIL   Вверх
dzaraev
Дата 1.3.2013, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Цитата(Flap @  1.3.2013,  16:49 Найти цитируемый пост)
Размести на главном окне Frame и пихай туда Page. Page на такую манипуляцию реагирует нормально. 

эта манипуляция открывает новое окно? мне нужны отдельные окна
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.