在 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 处理程序中的所有内容都成为 wpfICommand.Execute 中的一部分
我正在使用外部 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 处理程序中的所有内容都成为 wpfICommand.Execute 中的一部分