Как заставить ContentControl прослушивать не маршрутизированное событие внутри его ContentTemplate - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть некоторый повторно используемый ContentControl, который действует как псевдомодальное всплывающее окно в другом представлении. Он всегда здесь, и только его видимость заставляет его появляться или исчезать. При создании экземпляра внутри ContentControl будет создан пользовательский шаблон ContentTemplate, привязанный к некоторому ViewModel и представляющий содержимое «модального всплывающего окна».

<Dialogs:ModalDialog DialogHost="{Binding ElementName=layoutRoot, Mode=OneTime}"
                     Content="{Binding ViewModel.CurrentEditItem}"
                     IsShown="{Binding ViewModel.IsInEdit}">
  <Dialogs:ModalDialog.ContentTemplate>
    <DataTemplate>
      <ItemEditor:ItemEditorView />
    </DataTemplate>
  </Dialogs:ModalDialog.ContentTemplate>
</Dialogs:ModalDialog>

Теперь я хочу достичь следующего: корень ContentTemplate (здесь: ItemEditorView) должен реализовывать следующий интерфейс.

public interface ICloseMe
{
  event EventHandler<EventArgs> CloseMe;
}

Всякий раз, когда происходит событие CloseMe, окружающий ModalDialog должен быть «закрыт», устанавливая его VisibilityProperty в Hidden.

Представление во всплывающем окне (здесь ItemEditorView) не должно заботиться о том, показывается ли оно в ModalDialog или другом контексте, то есть оно не должно даже знать, что такой класс существует. Это исключает прогулку по логическому или визуальному дереву. Событие CloseMe запускается только при нажатии кнопок отмены / сохранения.

Кроме того, механизм не должен быть реализован / настроен в представлении, создающем экземпляр ModalDialog, представление должно быть настолько тупым, насколько это возможно.

Вместо этого «внешний» ModalDialog должен выполнять активную часть и прослушивать событие CloseMe. Как я могу реализовать это довольно чистым, MVVM-совместимым способом и без введения ненужных зависимостей? Есть ли какое-либо событие, происходящее после инициализации ContentTemplate, s.t. ModalDialog может затем оценить, если его корень расширяет ICloseMe?

1 Ответ

0 голосов
/ 07 декабря 2009

Как насчет включения в ICloseMe свойства Closed, для которого можно установить триггер в XAML?

...