1

我有一个简单的按钮:

<Button Content="Login" Command="{Binding StartAction}" IsEnabled="{Binding Path=Loading, Converter={StaticResource InverseBooleanConverter}}"/>

如您所见, IsEnabled 绑定到一个布尔属性。执行 StartAction 时,布尔值设置为 true,因此按钮被禁用(请注意,我使用的是 InverseBooleanConverter)。这工作正常。

更改布尔值后,StartAction 方法创建一个新线程,该线程在完成时调用 ViewModel 上的回调(创建线程的位置,因此可以找到 StartAction 方法的位置)。这个回调很简单:

private void DisplayResult()
{
    Loading = false;
}

这应该再次启用按钮,但是,这不会发生。

如果我在其他地方将加载设置为 false,则该按钮会启用。与按钮一起,其他一些元素(也绑定到此布尔值)在布尔值更改时应该变得不可见/可见,并且它也可以正常工作,即使回调方法更改了 Loading 属性。

我在这里有点困惑。为什么它不起作用?我认为这可能与线程有关,但我看不出有任何理由不应该这样做,特别是因为它可以与 UI 上的其他元素一起使用。

为了清楚起见,这是 Loading 属性:

public bool Loading
{
    get { return loading; }
    set
    {
        if (loading != value)
        {
            loading = value;
            RaisePropertyChanged("Loading");
        }
    }
}

知道这里可能有什么问题吗?

谢谢

4

1 回答 1

0

在您的回调中,您可能需要指示 UI 再次检查该属性并进行相应更新。这是使用CommandManager. 我在您的回调代码中添加了一些内容:

private void DisplayResult()
{
    Loading = false;
    CommandManager.InvalidateRequerySuggested();
}

CommandManager.InvalidateRequerySuggested指示 WPF 根据需要立即更新任何绑定的控件。

于 2012-06-19T16:28:50.153 回答