В WPF и с использованием Prism, как использовать MouseButtonEventArgs в качестве параметра команды для окна? - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу переместить окна без границ, и прежде чем я приму каркас Prism, я сделаю это следующим образом:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MouseDown += Window_MouseDown;
    }

    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ChangedButton == MouseButton.Left)
        {
            DragMove();
        }
    }
}

, но я не знаю, как реализовать это при использовании Prism в MainWindowViewModel.cs (модель представления), кажется, InvokeCommandAction может передать аргумент события для элемента, такого как кнопка или около того, но это не работает для окна в моем случае.

Может кто-нибудь помочь мне в этом? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Что ж, наконец-то я получил событие, но похоже, что этот подход противоречит концепции шаблона MVVM, которая требует, чтобы модель представления ничего не знала и не зависела ни от каких элементов представления.

В моем случае я могу добавить Interaction.Triggers в Window и передать MouseButton в модель представления, используя usng InvokeCommandAction Prism , следующим образом:

<Window
        xmlns:prism="http://prismlibrary.com/"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
/>

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDown">
            <prism:InvokeCommandAction Command="{Binding WindowMouseCommand}" TriggerParameterPath="ChangedButton" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

и в модели представления:

    public DelegateCommand<object> WindowMouseCommand { get; private set; }

...

    WindowMouseCommand = new DelegateCommand<object>(WindowMouse);

...

private void WindowMouse(object mouseButton)
{
    if (mouseButton is MouseButton m)
    {
        if (m == MouseButton.Left)
        {
            // DragMove();
        }
    }
}

, если я хочу вызвать .DragMove () Мне нужна ссылка на окно ... это не правильная реализация шаблона MVVM.

Так, каков наилучший подход / практика для этого?


Я внезапно просветился, когда увидел этот ответ: https://stackoverflow.com/a/3426183/10958770

да, перемещение окнаэто логика чистого пользовательского интерфейса , поэтому нет необходимости перемещать его в ViewModel ... поэтому позвольте мне просто оставить его в виде.

0 голосов
/ 10 ноября 2019

Я не знаю, как реализовать это при использовании Prism

Я не знаю, что это должно быть точно, но я будуПредположим, это , как вызывать модель представления, когда происходит какое-то событие в представлении :

Самый чистый вариант - это прикрепленное поведение. В качестве альтернативы вы можете использовать вариант InvokeCommandAction, например DevExpress 'EventToCommand, который поддерживает пересылку параметра.

...