Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF ICommand可以从其他线程执行更新_C#_Wpf - Fatal编程技术网

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>