MVVM中的属性更改时,UI元素未更新

时间:2019-03-05 17:09:37

标签: mvvm

我有一个以前从未见过的问题。 在我的视图服务中,我有一种方法旨在触发“忙”事件,以指示应用程序处于繁忙状态(因此用户将知道该应用程序在“思考”并且未挂断)。

    private bool isBusy;
    public event EventHandler<EventArgs<bool>> BusyChanged;

    public void ShowBusy(bool isBusy)
    {
        if (this.isBusy == isBusy) {return;}

        this.isBusy = isBusy;

        BusyChanged?.Invoke(this, new EventArgs<bool>(this.isBusy));
    }

此方法将为isBusy(true)触发一个BusyChanged事件,为isBusy(false)触发一个事件。此事件与mainViewModel的属性绑定,该属性又在UI中具有绑定到它的项目。

viewService.BusyChanged += (_, e) => mainWindowViewModel.IsBusy = e.Data;

目前,我正在使用一种简单的配色方案,指示忙碌或默认为不忙。

MainViewModel中的“ IsBusy”属性具有NotifyOfPropertyChange方法(该方法当然实现了INotifyPropertyChanged接口)。

    public bool IsBusy
    {
        get => this.isBusy;
        set
        {
            this.isBusy = value;
            NotifyOfPropertyChange(() => this.IsBusy);
        }
    }

并且XAML项(如前所述)具有绑定到该属性的DataTrigger样式触发器。

<Ellipse x:Name="ActionStatusEllipse" Width="17" Height="17" HorizontalAlignment="Right" 
                             Margin="0,0,10,0" VerticalAlignment="Center" >

                        <Ellipse.Style>
                            <Style TargetType="{x:Type Ellipse}" >
                                <Setter Property="Stroke" Value="#03A631"/>
                                <Setter Property="StrokeThickness" Value="4" />

                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsBusy}" Value="False">
                                        <Setter Property="Stroke" Value="#03A631" />
                                    </DataTrigger>

                                    <DataTrigger Binding="{Binding IsBusy}" Value="True">
                                        <Setter Property="Stroke" Value="#E9F80C" />
                                    </DataTrigger>
                                </Style.Triggers>

                            </Style>
                        </Ellipse.Style>
                    </Ellipse>

当我运行应用程序时,颜色没有按预期变化。但是,奇怪的是,如果我在IsBusy属性的NotifyOfPropertyChange行之后添加MessageBox,则它可以工作。我已经尝试了很多方法,但是似乎无法破解这个问题。为什么在属性中添加MessageBox会导致UI元素看到属性更改,但没有MessageBox却看不到它?有人看到过这种行为吗?我希望这个问题描述足够清楚。

0 个答案:

没有答案