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