Вложенное событие UserControl не работает с EventTrigger / InvokeCommandAction в сценарии MVVM / WPF - PullRequest
0 голосов
/ 22 ноября 2018

Я работаю с WPF с Prism (MVVM) и пытаюсь создать Инспектор для нескольких классов.Один из этих классов - Vector3:

<Grid x:Name="Vector3Root" Background="White">
    <StackPanel Orientation="Horizontal">
        <StackPanel Orientation="Horizontal">
            <xctk:DoubleUpDown Tag="X" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding X}" ValueChanged="Vector3ValueChanged"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <xctk:DoubleUpDown Tag="Y" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Y}" ValueChanged="Vector3ValueChanged"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <xctk:DoubleUpDown Tag="Z" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Z}" ValueChanged="Vector3ValueChanged"/>
        </StackPanel>
    </StackPanel>
</Grid>

И его кодовый компонент

namespace SimROV.WPF.Views{
public partial class Vector3View : UserControl
{
    public Vector3View()
    {
        InitializeComponent();
    }

    public static readonly RoutedEvent SettingConfirmedEvent =
        EventManager.RegisterRoutedEvent("SettingConfirmed", RoutingStrategy.Bubble,
        typeof(RoutedEventHandler), typeof(Vector3View));

    public event RoutedEventHandler SettingConfirmed
    {
        add { AddHandler(SettingConfirmedEvent, value); }
        remove { RemoveHandler(SettingConfirmedEvent, value); }
    }

    public void Vector3ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        RaiseEvent(new RoutedEventArgs(SettingConfirmedEvent));
    }
}}

Проблема, с которой я борюсь, заключается в том, что я не могу перехватить ни одно из запущенных событий.(ValueChanged или SettingConfirmed) на другой UserControl ViewModel, которая использует Vector3View:

<UserControl
         x:Class="SimROV.WPF.Views.TransformView"
         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:views="clr-namespace:SimROV.WPF.Views"
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
         xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
         xmlns:prism="http://prismlibrary.com/"

mc:Ignorable="d" >

<Grid x:Name="TransformRoot" Background="White">
    <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Position" Margin="5"/>
            <!--<ContentPresenter ContentTemplate="{StaticResource Vector3Template}"/>-->
            <views:Vector3View x:Name="PositionVector3">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SettingConfirmed">
                        <prism:InvokeCommandAction Command="{Binding PositionValueChangedCommand}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </views:Vector3View>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Rotation" Margin="5"/>
            <!--<ContentPresenter ContentTemplate="{StaticResource Vector3Template}"/>-->
            <views:Vector3View x:Name="RotationVector3" SettingConfirmed="RotationValueChangedEvent"/>
        </StackPanel>
    </StackPanel>
</Grid>

В этот момент я МОГУ ловить SettingConfirmed с помощью RotationValueChangedEvent на коде позади, но так как я следую шаблону MVVM, это не работает для меня, поэтому я использую EventTrigger и InvokeCommandAction для перехвата этих событий на TransformViewModel, но они никогдауволен.Вот это TransformViewModel:

namespace SimROV.WPF.ViewModels{
public class TransformViewModel : BindableBase
{
    private ICommand _positionCommand;

    public ICommand PositionValueChangedCommand => this._positionCommand ?? (this._positionCommand = new DelegateCommand(PositionChanged));
    private void PositionChanged()
    {

    }
    public TransformViewModel()
    {

    }
}}

PositionChanged просто никогда не увольняют, и я вообще не могу понять, почему.

Я не знаю, насколько это актуально, ноTransform - это элемент ObservableCollection<IComponent> в другой ViewModel, который представлен ListView с ItemContainerStyle, который имеет ContentPresenter с ContentTemplateSelector внутри.

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

Спасибо.

1 Ответ

0 голосов
/ 22 ноября 2018

Ваши EventTrigger и InvokeCommandAction должны работать нормально, при условии, что DataContext Vector3View на самом деле является TransformViewModel, поэтому привязка к свойству PositionValueChangedCommand завершается успешно.

...