C#/WPF — DataEventTrigger или как вызвать событие

Я пытаюсь отразить несколько прямоугольников из окна MainWindow. То, что я хочу сделать, вместо того, чтобы использовать кнопку, пытается получить событие для запуска перелистывания. Я попытался связать событие в пользовательском классе с ICommand, который является хорошо известным ScrollBehavior. Проблема в том, что при загрузке программы возникает это исключение:

XamlParseException для Interactivity.TriggersCollection

Изображение примерно такое:

Прямоугольники в поле зрения

Из того, что у меня есть, событие

public class FlipClass
{ 
    int i = 0;
    public void FlipEvent(object sender, EventArgs e)
    {
        i++;
        Console.WriteLine(i);
        myTestingString = johnny;
    }
}

Этот самый класс связан с моим MainWindow благодаря DataContext следующим образом:

public MainWindow()
    {
        InitializeComponent();

        FlipClass() _flipClass = new FlipClass();



        this.WindowStartupLocation = WindowStartupLocation.CenterScreen;


        DataContext = _flipClass;       //The Context is here


        Stopwatch moi = new Stopwatch();
        moi.Start(): //Monitoring the Window



        moi.Stop();
        Console.WriteLine(moi.ElapsedMilliseconds);


        Closing += OnClosing;            

    }

Наконец, в моем коде XAML у меня есть это

 <ec:PathListBox x:Name="pathListBox" Margin="312,566.254,299.5,407" WrapItems="True" ItemContainerStyle="{DynamicResource PathListBoxItemStyle1}">
        <i:Interaction.Behaviors>
            <local:PathListBoxScrollBehavior>
                <i:Interaction.Triggers>
                    <local:DataEventTrigger EventName="FlipEvent">    <------- This is Where I get the Exception
                        <i:InvokeCommandAction CommandName="DecrementCommand"/>
                    </local:DataEventTrigger>
                </i:Interaction.Triggers>
                <local:PathListBoxScrollBehavior.Ease>
                    <QuarticEase EasingMode="EaseOut"/>
                </local:PathListBoxScrollBehavior.Ease>
            </local:PathListBoxScrollBehavior>
        </i:Interaction.Behaviors>
        <ec:PathListBox.LayoutPaths>
            <ec:LayoutPath SourceElement="{Binding ElementName=path}" Distribution="Even" Capacity="3"/>
        </ec:PathListBox.LayoutPaths>
        <Rectangle HorizontalAlignment="Left" Height="139.96" Stroke="#FF6DBDD1" StrokeThickness="1" VerticalAlignment="Top" Width="202" Fill="#FFA7CEF5"/>
        <Rectangle HorizontalAlignment="Left" Height="139.96" Stroke="#FF6DBDD1" StrokeThickness="1" VerticalAlignment="Top" Width="202" Fill="#FFA7CEF5"/>
        <Rectangle HorizontalAlignment="Left" Height="139.96" Stroke="#FF6DBDD1" StrokeThickness="1" VerticalAlignment="Top" Width="202" Fill="#FFA7CEF5"/>
        <Rectangle HorizontalAlignment="Left" Height="139.96" Stroke="#FF6DBDD1" StrokeThickness="1" VerticalAlignment="Top" Width="202" Fill="#FFA7CEF5"/>
        <Rectangle HorizontalAlignment="Left" Height="139.96" Stroke="#FF6DBDD1" StrokeThickness="1" VerticalAlignment="Top" Width="202" Fill="#FFA7CEF5"/>
        <Rectangle HorizontalAlignment="Left" Height="139.96" Stroke="#FF6DBDD1" StrokeThickness="1" VerticalAlignment="Top" Width="202" Fill="#FFA7CEF5"/>
    </ec:PathListBox>

Я намеренно сократил остальную часть кода XAML, поскольку она не имеет значения.

Точность: когда я помещаю код, который запускает команду с помощью кнопки, он работает отлично. DataEventTrigger заменяется на:

<i:EventTrigger SourceName="button" EventName="Click">
                        <i:InvokeCommandAction CommandName="DecrementCommand"/>
                    </i:EventTrigger>

Я предполагаю, что мое событие плохо связано. У вас есть какие-либо предложения? Спасибо за помощь, надеюсь мой вопрос понятен.


person LePingu    schedule 29.07.2015    source источник


Ответы (1)


Итак, то, что я сделал, это небольшой трюк, чтобы ответить на мои потребности. Вместо использования DataEventTrigger я установил DataTrigger.

Используя интерфейс INotifyPropertyChanged, я могу изменить значение логического значения в FlipClass, которое я пишу следующим образом.

public class FlipClass
{
private bool myBool = false;
public void FlipEvent(object sender, EventArgs e)
{
     myBool = true;
}

#region INotifyPropertyChanged implementation 


   public event PropertyChangedEventHandler PropertyChanged; 

   public void OnPropertyChanged(PropertyChangedEventArgs e)
   {


       PropertyChangedEventHandler h = PropertyChanged;
       if (h != null)
       {
           h(this, e);
       }
       else
       {
           Console.WriteLine("fail");
       }
   }

   public void OnPropertyChanged(string propertyName)
   {
       OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
   }

   #endregion INotifyPropertyChanged implementation


   public bool CompareMyBool {
       get { return myBool;}
       set
       {
           if (value != myBool)
           {
               myBool = value;
               OnPropertyChanged("CompareMyBool");
           }
       }
   }
}

DataContext не меняется. Наконец, моя часть XML, содержащая триггер, будет заменена этим фрагментом кода:

<ei:DataTrigger Binding="{Binding CompareMyBool}" Value="True">
                        <i:InvokeCommandAction CommandName="IncrementCommand"/>
                    </ei:DataTrigger>

Предупреждение об анимации WPF: 6: Невозможно выполнить действие Остался последний момент, о котором нужно позаботиться. Только с этим кодом прокрутка бесконечна, и эта проблема всплывет. Необходимо определить триггер остановки.

person LePingu    schedule 11.08.2015