簡體   English   中英

在WPF中使用ICommand重寫“ button.Click + =…”

[英]Rewrite “button.Click += …” using ICommand in WPF

我正在使用外部SDK。

namespace ProSimSDK 
{
    public class ArmedFailure
   {
     ...
     public static event ArmedFailureEventDelegate onNew;
     public void Reset();
     ...
   }
}

namespace ProSimSDK
{
   public delegate void ArmedFailureEventDelegate(ArmedFailure armedFailure);
}

當我嘗試通過WPF重寫一些Winform代碼時遇到一些麻煩。 在Winform中:

public Form1()
{
    InitializeComponent();
    ArmedFailure.onNew += new ArmedFailureEventDelegate(ArmedFailure_onNew);
}

// This function will be called when a new armedFailure is received
void ArmedFailure_onNew(ArmedFailure armedFailure)
{
      //Here is the code I need to rewrite in WPF.
      removeButton.Click += new EventHandler(delegate(object sender, EventArgs e)
        {
            failure.Reset();
        });
}

在WPF中,我使用一個列表框。 通過一些指南,我正在使用ListBox模板和命令。 在Window1.xaml中:

<DataTemplate x:Key="ListBoxItemTemplate">
    <Grid>
        <TextBlock x:Name="TB" Margin="5,10,5,5" Grid.Column="2" Height="23" Text="{Binding}" VerticalAlignment="Top" />
        <Button HorizontalAlignment="Right" Grid.Column="3" Margin="500,10,5,0" CommandParameter="{Binding}" Command="{Binding ElementName=UC_Failures_Setting, Path=OnClickCommand}" Width="80" Click="Button_Click">remove</Button>
    </Grid>
</DataTemplate>

<ListBox x:Name="listbox" ItemTemplate="{StaticResource ListBoxItemTemplate}" Margin="0,661,982,0" SelectionChanged="ListBox_SelectionChanged">

Window1.xaml.cs

public Window1()
{
    InitializeComponent();

    //How to implement the same functionality of "removeButton.Click += new EventHandler(delegate(object sender, EventArgs e) {failure.Reset();});" shown in Winform???
    OnClickCommand = new ActionCommand(x => listbox.Items.Remove(x));
}

ActionCommand.cs:

 public class ActionCommand: ICommand
 {
    private readonly Action<object> Action;
    private readonly Predicate<object> Predicate;

    public ActionCommand(Action<object> action) : this(action, x => true)
    {

    }
    public ActionCommand(Action<object> action, Predicate<object> predicate)
    {
        Action = action;
        Predicate = predicate;
    }

    public bool CanExecute(object parameter)
    {
        return Predicate(parameter);
    }
    public void Execute(object parameter)
    {
        Action(parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add
        {
            CommandManager.RequerySuggested += value;
        }
        remove
        {
            CommandManager.RequerySuggested -= value;
        }
    }
}

我的列表框中的按鈕如何實現以下功能:

removeButton.Click += new EventHandler(delegate(object sender, EventArgs e) 
{ failure.Reset(); });

在Winform中顯示? 在WPF中,我不能這樣寫。 謝謝。

如果ListBox中裝有ArmedFailure項目,則命令接收的參數應為ArmedFailure項目。

OnClickCommand = new ActionCommand
( 
   x => 
   {
       var failure = (ArmedFailure)x;
       failure.Reset();
       listbox.Items.Remove(x);
   }
);

WinForms中Button.Click處理程序中的所有內容都成為wf中ICommand.Execute的一部分

暫無
暫無

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

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