在我的XAML代码中,我使用了一些命令:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open" Executed="OpenCommandHandler" />
<CommandBinding Command="ApplicationCommands.Save" Executed="SaveCommandHandler" CanExecuted="CanSaveCommandHandler" />
<CommandBinding Command="ApplicationCommands.Delete" Executed="DeleteCommandHandler" CanExecuted="CanDeleteCommandHandler" />
<CommandBinding Command="{x:Static local:MainWindow.AddCommand}" Executed="AddCommandHandler" CanExecuted="CanAddCommandHandler" />我的CanExecute方法是什么样子:
private ResearcherObservableCollection list;
public Researcher res;
public static RoutedCommand AddCommand = new RoutedCommand("Add", typeof(WpfApplication3.MainWindow));
private int _errors = 0;
public MainWindow()
{
InitializeComponent();
list = new ResearcherObservableCollection();
res = new Researcher();
this.DataContext = list;
}
private void CanSaveCommandHandler(object sender, CanExecuteRoutedEventArgs e)
{
if (list.Changes == true)
e.CanExecute = true;
else e.CanExecute = false;
}
private void CanAddCommandHandler(object sender, CanExecuteRoutedEventArgs e)
{
{
e.CanExecute = true;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Adding); i++)
{
var child = VisualTreeHelper.GetChild(Adding, i);
if (Validation.GetHasError(child)) { e.CanExecute = false; }
}
}
}
private void CanDeleteCommandHandler(object sender, CanExecuteRoutedEventArgs e)
{
if (((Project)this.projlst.SelectedItem) != null) e.CanExecute = true;
else e.CanExecute = false;
}当我不使用CanExecute方法而只使用Executed时,一切都是正常的。但问题是,在执行之前,我必须检查一些参数。我有例外的TargetInvocationException。也许你也有类似的问题?我如何更正我的代码?
发布于 2016-04-07 19:53:52
我解决了我的问题。我认为在我创建列表之前调用了CanExecute方法。因此,我们必须检查它们是否不为空:
private void CanAddCommandHandler(object sender, CanExecuteRoutedEventArgs e)
{
//if (VisualTreeHelper.GetChild(Adding))
{
e.CanExecute = true;
//for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Adding); i++)
//{
// var child = VisualTreeHelper.GetChild(Adding, i);
// if (Validation.GetHasError(child)) { e.CanExecute = false; }
//}
if (Adding != null)
{
for (int i = 0; i < Adding.Children.Count; i++)
{
var child = Adding.Children[i];
if (Validation.GetHasError(child)) { e.CanExecute = false; break; }
}
}
else e.CanExecute = false;
}
}
private void CanSaveCommandHandler(object sender, CanExecuteRoutedEventArgs e)
{
if (lst != null)
{
if (list.Changes == true)
e.CanExecute = true;
else e.CanExecute = false;
}
else e.CanExecute = false;
}
private void CanDeleteCommandHandler(object sender, CanExecuteRoutedEventArgs e)
{
if (lst != null)
{
if (((Researcher)this.lst.SelectedItem) != null) e.CanExecute = true;
}
else e.CanExecute = false;
}XAML代码中的一些更改:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open" Executed="OpenCommandHandler" />
<CommandBinding Command="ApplicationCommands.Save" Executed="SaveCommandHandler" CanExecute="CanSaveCommandHandler" />
<CommandBinding
Command="ApplicationCommands.Delete"
CanExecute="CanDeleteCommandHandler"
Executed="DeleteCommandHandler" />
<CommandBinding Command="{x:Static local:MainWindow.AddCommand}" Executed="AddCommandHandler" CanExecute="CanAddCommandHandler"/>
</Window.CommandBindings>https://stackoverflow.com/questions/36446184
复制相似问题