C# WPF ICommand可以从其他线程执行更新
我在C# WPF ICommand可以从其他线程执行更新,c#,wpf,C#,Wpf,我在MainViewModel中有以下ICommand作业: MineCommand = new ActionCommand( c => MineRulesForPolygon(SelectedPolygon, "stringParameter"), c => SelectedPolygon != null && !SelectedPolygon.IsLoading && SelectedPolyg
MainViewModel
中有以下ICommand
作业:
MineCommand = new ActionCommand(
c => MineRulesForPolygon(SelectedPolygon, "stringParameter"),
c => SelectedPolygon != null && !SelectedPolygon.IsLoading
&& SelectedPolygon.Records != null
&& MinSupport > 0 && MinSupport <= 1
&& MinConfidence > 0 && MinConfidence <= 1
&& !IsMining);
你们可以看到我在尝试几乎所有的解决方案(和第二个答案混合在一起)。从MainViewModel
调用LoadData
的方法是:
SelectedPolygon.LoadData(postLoading: () => MineCommand.RaiseCanExecuteChanged());
具有如下的raisecancecutechanged()
:
public void RaiseCanExecuteChanged()
{
CommandManager.InvalidateRequerySuggested();
}
为了确保CanExecute
的条件为真,我将断点放在lambda()=>MineCommand.RaiseCanExecuteChanged()
直接在参数中,并从CanExecute
计算这些值;正如预期的那样,评估结果是真实的。但是,绑定到此命令的按钮仍处于禁用状态:
<Button Grid.Row="5"
HorizontalAlignment="Center"
Content="Mine"
Style="{StaticResource CommandButtonStyle}"
Command="{Binding MineCommand}" >
</Button>
如何根据
CanExecute
change强制它更新其IsEnabled
属性?您如何验证lambda()=>MinCommand.RaiseCanecuteChanged()处的断点是否为true?这不是一个有条件的lamdba表达式。您是否尝试过直接将断点放在c=>SelectedPolygon!=空(&…
?也许其中一个条件返回false,我不想验证。此lambda是否为真,因为此方法是void
。我只在lambda即将执行时计算这些值。顺便说一下,c=>SelectedPolygon!=null&…
没有被调用。我只是重复了您在原始帖子中所说的,您“将断点放在lambda()=>MineCommand.raisecancecutechanged()
;正如预期的那样,评估结果为true”。你如何(和什么)评估结果的真实性?如果您现在说的是c=>SelectedPolygon!=null&…
根本没有被调用,那么您已经触及了按钮仍然被禁用的原因。1。将断点放在lambda 2上。在这里停下来。选择整个CanExecute
条件4。按Ctrl+D,Q确定,原因是WPF不会对未调用的CanExecute
change->getter做出反应,解决方法就是我的问题。
<Button Grid.Row="5"
HorizontalAlignment="Center"
Content="Mine"
Style="{StaticResource CommandButtonStyle}"
Command="{Binding MineCommand}" >
</Button>