Привязка команды WPF к статической модели - PullRequest
0 голосов
/ 06 марта 2019

Во-первых, я новичок в 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 или, возможно, с привязкой вообще. Я следовал многим руководствам и теперь застрял.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...