RaisePropertyChanged()没有更新单个按钮

时间:2015-09-03 06:06:03

标签: c# wpf xaml mvvm

我已经在我的WPF应用程序中使用MVVM了一段时间,但是我试图保持一个按钮被禁用,直到它可以被启用。没问题,我只是在ViewModel中制作一个bool并将其绑定到那个。

布尔:

    private bool m_EnableLoadQuickStatsButton;
    public bool EnableLoadQuickStatsButton
    {
        get { return m_EnableLoadQuickStatsButton; }
        set { m_EnableLoadQuickStatsButton = value; RaisePropertyChanged("EnableLoadQuickStatsButton"); }
    }

XAML按钮:

                <Button Margin="5"
                        FontSize="14"
                        IsEnabled="{Binding EnableLoadQuickStatsButton}">
                    Load Quickstats
                </Button>

DataContext声明:

DataContext="{StaticResource MainScreenViewModel}

设计师的.gif和按初始属性值启用/禁用的按钮示例:http://i.imgur.com/lpVeEBd.gif

根据Property开头的内容启用/禁用该按钮。但是,更改属性不会启用/禁用我的按钮。为什么是这样?我的任何其他控件和属性似乎都没有任何问题。

编辑:

我的类正确实现了INotifyPropertyChanged,还有其他属性的值绑定到我的WPF应用程序中的控件,按预期工作。

Edit2:应用程序的A.gif,显示了DataBinding工作的其他部分:http://i.imgur.com/lIvzHv7.gif

Edit3:开始调试时的输出:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=51180192) for Binding (hash=56315736)
System.Windows.Data Warning: 58 :   Path: 'EnableLoadQuickStatsButtonTest'
System.Windows.Data Warning: 60 : BindingExpression (hash=51180192): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=51180192): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=51180192): Attach to System.Windows.Controls.Button.IsEnabled (hash=23804398)
System.Windows.Data Warning: 67 : BindingExpression (hash=51180192): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=51180192): Found data context element: Button (hash=23804398) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=51180192): Activate with root item MainScreenViewModel (hash=64564967)
System.Windows.Data Warning: 108 : BindingExpression (hash=51180192):   At level 0 - for MainScreenViewModel.EnableLoadQuickStatsButtonTest found accessor RuntimePropertyInfo(EnableLoadQuickStatsButtonTest)
System.Windows.Data Warning: 104 : BindingExpression (hash=51180192): Replace item at level 0 with MainScreenViewModel (hash=64564967), using accessor RuntimePropertyInfo(EnableLoadQuickStatsButtonTest)
System.Windows.Data Warning: 101 : BindingExpression (hash=51180192): GetValue at level 0 from MainScreenViewModel (hash=64564967) using RuntimePropertyInfo(EnableLoadQuickStatsButtonTest): 'False'
System.Windows.Data Warning: 80 : BindingExpression (hash=51180192): TransferValue - got raw value 'False'
System.Windows.Data Warning: 89 : BindingExpression (hash=51180192): TransferValue - using final value 'False'

Edit4:创建了一个新项目,它按预期工作,但由于某种原因,我的当前项目没有。

2 个答案:

答案 0 :(得分:2)

正如评论中所指出的,似乎ViewModel被多次实例化,按钮的DataContext中的那个与被更改的实例不同。

一个简单的测试就证明了这一点。

至于一些扩展提示......使用MVVM的想法是将视图与模型分开。我会避免使用名称暗示“按钮”或任何其他视觉元素的属性。

ViewModel中的

EnableLoadQuickStatsButton应该被称为类似AreQuickStatsReadyToBeLoaded之类的东西

答案 1 :(得分:0)

我尝试了相同的代码,但效果很好。

代码应为

EnableLoadQuickStatsButton = AFunctionReturnsBool();

更改属性时,也许您使用了

m_EnableLoadQuickStatsButton = AFunctionReturnsBool();