簡體   English   中英

如何在背后的代碼中調用棱鏡事件

[英]How to call Prism Event in Code Behind

我是WPF的新手。 當前,我想允許我的“添加”按鈕通過單擊或雙擊來添加項目。 但是,當我嘗試雙擊時,它將觸發兩次單擊事件。 XAML中的代碼如下:

<Button.InputBindings>
    <MouseBinding Command="{Binding Path=AddCommand}" CommandParameter="{Binding}" MouseAction="LeftClick" />
    <MouseBinding Command="{Binding Path=AddCommand}" CommandParameter="{Binding}" MouseAction="LeftDoubleClick" />

我找到了在線解決方案,該解決方案是使用DispatcherTimer來解決問題。 我在代碼中插入了這些:

private static DispatcherTimer myClickWaitTimer =
    new DispatcherTimer(
        new TimeSpan(0, 0, 0, 1),
        DispatcherPriority.Background,
        mouseWaitTimer_Tick,
        Dispatcher.CurrentDispatcher);

private void btnAdd_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
        // Stop the timer from ticking.
        myClickWaitTimer.Stop();

        // Handle Double Click Actions
}

private void btnAdd_Click(object sender, RoutedEventArgs e)
{
        myClickWaitTimer.Start();
}

private static void mouseWaitTimer_Tick(object sender, EventArgs e)
{
        myClickWaitTimer.Stop();

        // Handle Single Click Actions
}

所以這是我的問題。 我已刪除了XAML的MouseBinding並希望在后面的代碼呼吁AddCommand但我有問題,這樣做是由於PrismEventAggregator。 .cs中的AddCommand如下:

private void AddCommandExecute(Object commandArg)
{
     // Broadcast Prism event for adding item
     this.PrismEventAggregator.GetEvent<AddItemEvent>().Publish(
     new AddItemPayload()
       {
          BlockType = this.BlockType
       }
     );
}

因此,想知道如何在后面的代碼中調用AddCommand (.cs中的Prism事件)嗎?

注意:該按鈕位於資源字典中,因此我無法使用按鈕名稱來調用命令。

您需要創建一個類,該類將訂閱要發布的事件,然后執行所需的邏輯。

例如:

public class AddItemViewModel : INotifyPropertyChanged
{
    private IEventAggregator _eventAggregator;

    public AddItemViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.GetEvent<AddItemEvent>().Subscribe(AddItem);
    }

    private void AddItem(AddItemPayload payload)
    {
        // Your logic here
    }
}

然后,當您發布事件時,它將觸發訂閱者並執行。

使用Expression Blend SDK ,您可以創建包含所有自定義邏輯的Behavior 此行為將為命令及其參數提供兩個依賴項屬性,因此可以像為InputBinding一樣輕松地為它們創建Binding

將事件處理程序和DispatcherTimer邏輯移動到以下行為:

using System.Windows.Interactivity;

class ClickBehavior : Behavior<Button>
{
    // a dependency property for the command
    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.Register("Command", typeof(ICommand), 
            typeof(ClickBehavior), new PropertyMetadata(null));

    // a dependency property for the command's parameter        
    public static readonly DependencyProperty CommandParameterProperty =
        DependencyProperty.Register("CommandParameter", typeof(object), 
            typeof(ClickBehavior), new PropertyMetadata(null));

    public ICommand Command
    {
        get { return (ICommand)this.GetValue(CommandProperty); }
        set { this.SetValue(CommandProperty, value); }
    }

    public object CommandParameter
    {
        get { return this.GetValue(CommandParameterProperty); }
        set { this.SetValue(CommandParameterProperty, value); }
    }

    // on attaching to a button, subscribe to its Click and MouseDoubleClick events
    protected override void OnAttached()
    {
        this.AssociatedObject.Click += this.AssociatedObject_Click;
        this.AssociatedObject.MouseDoubleClick += this.AssociatedObject_MouseDoubleClick;
    }

    // on detaching, unsubscribe to prevent memory leaks
    protected override void OnDetaching()
    {
        this.AssociatedObject.Click -= this.AssociatedObject_Click;
        this.AssociatedObject.MouseDoubleClick -= this.AssociatedObject_MouseDoubleClick;
    }        

    // move your event handlers here        
    private void AssociatedObject_Click(object sender, RoutedEventArgs e)
    { //... }        

    private void AssociatedObject_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    { //... }

    // call this method in your event handlers to execute the command
    private void ExecuteCommand()
    {
        if (this.Command != null && this.Command.CanExecute(this.CommandParameter))
        {
            this.Command.Execute(this.CommandParameter);
        }
    }

用法很簡單。 您需要聲明其他名稱空間:

<Window
    xmlns:local="Your.Behavior.Namespace"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    ...

最后,將行為附加到按鈕:

<Button>
    <i:Interaction.Behaviors>
        <local:ClickBehavior Command="{Binding AddCommand}" CommandParameter="{Binding}"/>
    </i:Interaction.Behaviors>
</Button>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM