Во-первых, я новичок в WPF и MVVM, изо всех сил стараюсь написать хорошо структурированный / разделенный код, поэтому, пожалуйста, будьте добры.
Я создал пользовательский элемент управления и свою собственную модель отдельного представления. В модели представления у меня есть ICommand, которая относится к методу в той же модели представления. Я связываюсь с этой командой в XAML, используя System.Windows.Interactivity для такого события, как: -
<UserControl x:Class="MyNamespace.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:local="clr-namespace:MyNamespace"
mc:Ignorable="d"
Height="300"
d:DesignHeight="300" d:DesignWidth="1500"
IsManipulationEnabled="True"
Background="{StaticResource BackgroundWhiteBrush}">
<Grid
d:DataContext="{x:Static local:MyControlDesignModel.Instance}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewMouseUp">
<i:InvokeCommandAction Command="{Binding MyViewModelCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Grid>
Мой код (который я пытаюсь оставить как можно пустым) выглядит так:
namespace MyNamespace
{
/// <summary>
/// Interaction logic for MyControl.xaml
/// </summary>
public partial class MyControl : UserControl
{
public MyControl()
{
DataContext = ViewModelMyControl;
InitializeComponent();
}
}
}
Я хочу использовать этот элемент управления на нескольких страницах. Я также хочу иметь возможность вызывать метод в этой модели представления (передавая параметр) из других моделей представления, чтобы позволить ему обновлять себя из хранилища данных.
Я использовал контейнер DI для предоставления ссылки на модель представления, чтобы я мог а) ссылаться на его метод загрузки данных из другого места и б) устанавливать его в DataContext в коде (см. Выше).
Реализация контейнера DI обеспечивает это следующим образом:
/// <summary>
/// A shortcut to access the <see cref="MyControlViewModel"/>
/// </summary>
public static MyControlViewModel ViewModelMyControl => Framework.Service<MyControlViewModel>();
С помощью этой модели представления, на которую ссылается DI в DataContext, событие / команда не запускается.
Если я изменю код на следующий, событие / команда сработает, но затем я потеряю статическую ссылку, которую я пытался «удерживать» между страницами. Кажется, я могу иметь события или статическую ссылку, но не оба.
namespace MyNamespace
{
/// <summary>
/// Interaction logic for MyControl.xaml
/// </summary>
public partial class MyControl : UserControl
{
public MyControl()
{
DataContext = new MyControlViewModel();
InitializeComponent();
}
}
}
Я думаю, что это как-то связано с жизненным циклом ViewModel или, возможно, с привязкой вообще. Я следовал многим руководствам и теперь застрял.
Как запустить событие / команду, а также сохранить ссылку на данные пользовательского элемента управления между страницами, которые его используют?