Wpf 无法在运行时更新HamburgerManuItem IsEnabled属性

Wpf 无法在运行时更新HamburgerManuItem IsEnabled属性,wpf,xaml,mahapps.metro,Wpf,Xaml,Mahapps.metro,从HamburgerManuItem更新IsEnabled属性时遇到问题。 首先,我将IsEnabledProperty的值设置为false,然后在运行时,我试图将其更改为true,但调试器一直说该值为false。当然,UI仍然显示它已被禁用。代码如下: 视图: 您能告诉我我做错了什么,以及如何正确更新IsEnabled Dependency属性吗?要启用HamburgerMinuItem您应该将其命令属性设置为其CanExecute方法返回true的命令 您不能仅将IsEnabled属性设置为

从HamburgerManuItem更新IsEnabled属性时遇到问题。 首先,我将IsEnabledProperty的值设置为false,然后在运行时,我试图将其更改为true,但调试器一直说该值为false。当然,UI仍然显示它已被禁用。代码如下:

视图:


您能告诉我我做错了什么,以及如何正确更新IsEnabled Dependency属性吗?

要启用
HamburgerMinuItem
您应该将其
命令属性设置为其
CanExecute
方法返回
true
的命令

您不能仅将
IsEnabled
属性设置为
true
。如果查看一下,您将看到有一个
强制值回调
,它返回private
CanExecute
方法的值:

private static object IsEnabledCoerceValueCallback(DependencyObject d, object value)
{
    if (!(bool)value)
    {
        return false;
    }
    return ((HamburgerMenuItem)d).CanExecute;
}

听起来IsEnabledProperty真的没用,因为一旦设置了值,它就无法更改。(或者可能是因为我没有将它绑定到某个属性上)。同时,我将按照您当时的建议使用ICommand的CanExecute。您是否将其绑定到某个属性并不重要。您需要使用Command属性来启用/禁用该项。
private HamburgerMenuItemCollection menuItems;
public HamburgerMenuItemCollection MenuItems
{
    get {return menuItems;}
    set {SetProperty(ref menuItems, value);}
}
public ICommand TestCommand {get; private set;}

public MyVM()
{
   MenuItems = new HamburgerMenuItemCollection()
   {
       new HamburgerMenuGlyphItem()
       {
          Glyph="1",
          Label="1"
       };
       // Second MenuItem is disabled
       new HamburgerMenuGlyphItem()
       {
          Glyph="2",
          Label="2",
          IsEnabled=false;
       };
   };
   TestCommand = new DelegateCommand(UpdateIsEnabled);
}

private void UpdateIsEnabled()
{
    var menuItem = MenuItems[1];
    menuItem.IsEnabled = true; // after this is executed, Debugger shows that IsEnabled is still false;
    if (menuItem.IsEnabled != isEnabled)
    {
       vm.BeginInvoke(() =>
       {
          vm.IsEnabled = isEnabled; // redo, but it seems like none of these are called
          vm.SetValue(HamburgerMenuGlyphItem.IsEnabledProperty, isEnabled);
          vm.SetCurrentValue(HamburgerMenuGlyphItem.IsEnabledProperty, isEnabled);
          vm.InvalidateProperty(HamburgerMenuGlyphItem.IsEnabledProperty);
       }, System.Windows.Threading.DispatcherPriority.Normal);
    }
    RaisePropertyChanged(nameof(MenuItems));
}
private static object IsEnabledCoerceValueCallback(DependencyObject d, object value)
{
    if (!(bool)value)
    {
        return false;
    }
    return ((HamburgerMenuItem)d).CanExecute;
}