Свойство HamburgerMenuItem IsEnabled не может быть обновлено во время выполнения - PullRequest
0 голосов
/ 03 января 2019

У меня проблема с обновлением свойства IsEnabled из HamburgerMenuItem. Сначала я устанавливаю значение IsEnabledProperty равным false, а затем во время выполнения я пытаюсь изменить его на true, но отладчик продолжает говорить, что значение равно false. И, конечно же, пользовательский интерфейс также показывает, что он отключен. Ниже приведен код:

Вид:

xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"

<UserControl.Resources>
   <DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type metro:HamburgerMenuGlyphItem}">
        <Grid Height="50">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column=0 Text="{Binding Glyph}"/>
            <TextBlock Grid.Column=1 Text="{Binding Label}"/>
        </Grid>
   </DataTemplate>
</UserControl.Resources>
<controls:x:Name="HamburgerMenuControl"
          DisplayMode="CompactInline"
          ItemTemplate="{StaticResource MenuItemTemplate}"
          ItemsSource="{Binding MenuItems, Mode=OneWay}"/>
<Button Content="Test Button" Command="{Binding TestCommand, Mode=OneTime}"/>

ViewModel:

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));
}

Можете ли вы показать мне, что я сделал неправильно и как правильно обновить свойство зависимости IsEnabled?

1 Ответ

0 голосов
/ 03 января 2019

Чтобы включить HamburgerMenuItem, необходимо установить его свойство Command для команды, чей метод CanExecute возвращает true.

Вы не можете просто установить для свойства IsEnabled значение true.Если вы посмотрите на , как класс HamburgerMenuItem реализован на GitHub , вы увидите, что существует CoerceValueCallback, который возвращает значение частного CanExecute метода:

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