Я разрабатываю приложение для Windows Store с использованием шаблона MVVM (без рамки, только raw MVVM).Обработка событий в приложениях Windows Store с использованием MVVM
У меня есть пользовательское управление DropboxFileplanUserControl.xaml
, у которого есть соответствующая модель просмотра DropboxFileplanViewModel.cs
. DropboxFileplanUserControl
встроен в MainPage.xaml
и MainPage.xaml
имеет ассоциированную модель просмотра, MainPageViewModel.cs
.
Мой вопрос: Как я могу определить и поднять событие в DropboxFileplanViewModel.cs
и обрабатывать его в MainPageViewModel.cs
? Предположим, что событие, которое будет поднято, называется ImageLoaded
.
EDIT: я добавил следующие конкретные фрагменты кода ...
DropboxFileplanUserControl.xaml
<UserControl
x:Class="PhotoBox.Controls.DropboxFileplanUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:PhotoBox.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:PhotoBox.ViewModels"
xmlns:triggers="using:WinRT.Triggers"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="200">
<UserControl.DataContext>
<viewModels:DropboxFileplanViewModel />
</UserControl.DataContext>
<Grid>
<ListBox>
<!--
...
...
Here I define a ListBox and use interaction triggers to bind the SelectionChanged event to FileplanSelectionChangedCommand on the ViewModel -->
<triggers:Interactions.Triggers>
<triggers:EventTrigger EventName="SelectionChanged">
<triggers:InvokeCommandAction Command="{Binding FileplanSelectionChangedCommand}" PassEventArgsToCommand="True" />
</triggers:EventTrigger>
</triggers:Interactions.Triggers>
</ListBox>
</Grid>
DropboxFileplanViewModel.xamlПримечание: Я раздели много кода из этого фрагмента
public class DropboxFileplanViewModel : ViewModel
{
public DelegateCommand FileplanSelectionChangedCommand { get; set; }
public DropboxFileplanViewModel()
{
FileplanSelectionChangedCommand = new DelegateCommand(FileplanSelectionChanged);
}
private void FileplanSelectionChanged(object parameter)
{
var args = (SelectionChangedEventArgs) parameter;
// Some other stuff is done here but ultimately,
// GetImageFile is called
}
private async void GetImageFile(MetaData file)
{
// Stuff is done here to get the image
// ******************************
// Here I want to raise the event
// ******************************
}
}
DropboxFileplanUserControl
вкладывается в MainPage.xaml
следующим образом ...
MainPage.xaml
<controls:DropboxFileplanUserControl
Grid.Row="0"
DataContext="{Binding FileplanControl}"
Visibility="{Binding IsOpen, Converter={StaticResource BooleanToVisibilityConverter}}"
IsEnabled="{Binding IsOpen}"
<!-- *** Here I need to access the ImageLoaded event and bind it to a command in MainPageViewModel.cs *** -->
/>
Таким образом, чтобы подвести итог, мне нужно объявлять и вызывать событие в DropboxFileplanViewModel.cs
и получить доступ к этому событию в MainPage.xaml
, поэтому я могу обработать его в MainPageViewModel.cs
. Я знаю, как связать событие в MainPage.xaml
с командой в MainPageViewModel
, мне просто нужно знать, как сделать первый бит, т. Е. Объявить и поднять событие в DropboxFileplanViewModel.cs
и получить доступ к нему в MainPage.xaml
.
Вы используете базовый класс для хранения ваших моделей, например ViewModelLocator (mvvm light)? Можете ли вы добавить код для своих моделей xaml и viewmodels? – SWilko
Иерархия наследования моих моделей просмотра - 'ViewModel: BindableBase: INotifyPropertyChanged'. Я попытался сохранить свой первоначальный вопрос как можно более общим в отношении имен классов, но я отредактирую сообщение с фактическими фрагментами кода. –
Спасибо за код. Легкий способ сделать это - использовать класс Messenger в mvvmlight, но я подумал, что сначала должен проверить, прежде чем отвечать на вопрос, поскольку вы не используете фреймворк. – SWilko