UWP - передать событие для управления (туннелирование) - PullRequest
1 голос
/ 29 марта 2019

У меня есть вопрос UWP о наследовании / передаче события пользовательскому элементу управления из родительского представления в дочернее.

Я создал пользовательский элемент управления для отображения наложений текста (см. Код ниже). У нас был родительский вид, который отображал бы наложение при изменении размера окна (см. Код ниже). Наложение будет отображать размеры окна, когда это даже срабатывает.

Я переместил оверлей в пользовательский элемент управления, и теперь я пытаюсь передать событие с измененным размером в элемент управления оверлеем. Мы надеемся, что мы можем зарегистрировать больше событий в оверлейном контроле, чтобы он мог отображать больше, чем изменение размера Информация. Тем не менее, я не уверен, лучший способ сделать это. Моей первой идеей было наследование от представления, поэтому я мог просто прослушивать событие из оверлея, но это приводило к ошибкам. Я считаю, что из-за того, что родительское представление имеет ViewModel (я также создал один для оверлея, не уверен, действительно ли он еще нужен). Я читал о многих возможных способах сделать это, но я не уверен, что будет лучшим способом сделать это. У кого-нибудь есть понимание по этому вопросу? Я был бы открыт для предложений, ссылок или просто общего ответа Каков наилучший способ добиться этого в нашем проекте.

Родительский вид

enter image description here

Контроль пользователя

enter image description here

родительское событие enter image description here

Контрольный класс

enter image description here

Некоторая информация, о которой я читал:

https://documentation.devexpress.com/WPF/17449/MVVM-Framework/ViewModels/ViewModel-relationships-ISupportParentViewModel

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/preview-events

https://social.msdn.microsoft.com/Forums/windows/en-US/742077f6-e875-44d1-8bc4-6e6516db9eda/passing-the-parent-control-event-to-child-controls?forum=winforms

https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/events-and-routed-events-overview

http://irisclasson.com/2013/12/10/passing-event-arguments-from-xaml-in-windows-store-apps-inputconverter-inputconverterparameter-etc/

https://docs.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service

Обновление Добавление viewModel в родительский viewModel (терминал) и передача его в элемент управления через Datacontext не работало

Ответы [ 2 ]

2 голосов
/ 30 марта 2019

Поскольку вы уже используете MVVM, я бы порекомендовал пройти полный маршрут, используя "Интерактивность", "Команды" и "дочерние ViewModels".Это часто используемый шаблон в приложениях MVFM WPF, который также можно применять к приложениям UWP.

Использование «Интерактивности» и взаимодействий

Библиотека интерактивности / поведения от Microsoft позволяет связыватьсобытия в XAML до ICommand в ViewModel.Вы можете получить управляемый пакет NuGet здесь .

Из официальных примеров на GitHub , сокращенно:

<Button x:Name="button1" Content="Increment">
  <Interactivity:Interaction.Behaviors>
    <Interactions:EventTriggerBehavior EventName="Click" SourceObject="{Binding ElementName=button1}">
      <Interactions:InvokeCommandAction Command="{Binding UpdateCountCommand}"/>
    </Interactions:EventTriggerBehavior>
  </Interactivity:Interaction.Behaviors>
</Button>

Пересылать данные команды ребенкуViewModel

Теперь, когда это событие перенаправлено на вашу команду в родительском ViewModel, вы можете либо вызвать свой оверлей ViewModel и передать информацию непосредственно ему:

private readony IOverlayViewModel _overlayViewModel;

public ICommand UpdateCountCommand { get; set; }

ctor(IOverlayViewModel overlayViewModel)
{
    _overlayViewModel = overlayViewModel;
    UpdatedCountCommand = new MyICommandImplementation(UpdatedCountCommand_Executed);
}

private void UpdatedCountCommand_Executed(/* Add correct method signature */)
{
    // If needed, retrieve data from parameter...

    // Update overlay ViewModel text
    _overlayViewModel.Text = ""; // Whichever text was calculated before
}

Или вы используете мессенджер( шаблон-посредник ) для отправки его в оверлей.

0 голосов
/ 02 апреля 2019

Я неправильно использовал привязки. x: Bind и Binding используют разные типы контекста. Чтобы эта привязка работала, нам нужно установить элемент родительского элемента Datacontext в значение «this». x: Bind, с другой стороны, делает это неявно.

<views:OverlayView DataContext="{x:Bind ViewModel.Overlay}"></views:OverlayView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...