Как сделать меньше кода с несколькими флажками, которые вызывают одну и ту же команду - PullRequest
0 голосов
/ 23 ноября 2018

В настоящее время я делаю программу, в которой я хочу иметь несколько флажков и несколько кнопок, где каждая кнопка привязана к одному флажку.Когда флажок включен, он должен скрывать определенную кнопку.

На данный момент я могу сделать это для одной кнопки:

<CheckBox Name="cbxIsClosableForUser"
     DataContext="{StaticResource GeneralVM}"
     Command="{Binding BtnToggleLblVisibilityDelegateCommand, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
     CommandParameter="{Binding LblVisibilityCloseButton}"
     Content="{m:Translate ClosingAvailableForUser}" 
     Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3"
     Margin="6,0,0,0"
     HorizontalAlignment="Left" VerticalAlignment="Center" />

В другом представлении есть кнопки:

<Button DataContext="{StaticResource GeneralVM}"
     Visibility="{Binding LblVisibilityCloseButton, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
     Style="{StaticResource NewButtonStyle}" 
     Grid.Column="3"
     Grid.Row="3"
     PreviewMouseDown="ImQuit_PreviewMouseDown"
     HorizontalAlignment="Right"
     VerticalAlignment="Bottom" >
     <Image Name="imQuit"
          Source="/CWI;component/Images/quit.png" 
     Stretch="None"/>
</Button>

Вот код в ViewModel:

    public Visibility LblVisibilityCloseButton
    {
        get => _LblVisibilityCloseButton;
        set
        {
            OnPropertyChanged(nameof(LblVisibilityCloseButton)); 
            _LblVisibilityCloseButton = value;
        }
    }
    private Visibility _LblVisibilityCloseButton; 

    public GeneralViewModel()
    {
        LblVisibilityCloseButton = Visibility.Visible; 
        BtnToggleLblVisibilityDelegateCommand = new DelegateCommand<object>(ToggleVisibility); 
    }

    public DelegateCommand<object> BtnToggleLblVisibilityDelegateCommand { get; set; } 

    private void ToggleVisibility(object obj)
    {

        if (LblVisibilityCloseButton == Visibility.Visible)
        {
            LblVisibilityCloseButton = Visibility.Hidden;
        }
        else
        {
            LblVisibilityCloseButton = Visibility.Visible;
        }
    }

Теперь дело в том, что этот флажок работает идеально.Но я хочу, чтобы несколько других флажков вызывали одну и ту же команду, не повторяя себя, и добавили 5 других операторов if для 5 дополнительных кнопок.

Редактировать: я использую MVVM, я не хочу код, стоящий за вещами для каждого отдельного флажка.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Забудьте об этом способе viewmodel и используйте чистое решение xaml.

<CheckBox Name="cbxIsClosableForUser"/>
<Button Visibility="{Binding ElementName=cbxIsClosableForUser, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}"/>

Все, что вам нужно сделать, - это написать свой BooleanToVisibilityConverter, который реализует интерфейс IValueConverter , загрузитьэто как ресурсы приложения с определенным именем, как «BooleanToVisibilityConverter» или что вы хотите, и вы можете пойти.

Если они не находятся в одном представлении, но разделяют модель представления, то сделайте это

<CheckBox Name="cbxIsClosableForUser" IsChecked="{Binding IsClosableChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<Button Visibility="{Binding IsClosableChecked, Converter={StaticResource BooleanToVisibilityConverter}}"/>

, где IsClosableChecked - это логическое свойство модели представления, модель представления должна правильно реализовывать интерфейс INotifyPropertyChanged и уведомлять об изменениях в установщике свойства IsClosableChecked.

0 голосов
/ 23 ноября 2018

Вы можете использовать RelayCommands .Вы можете связать все кнопки с одной и той же Командой и передать дополнительный CommandParamter из вашего файла xaml.Параметр команды может быть обработан в вашей виртуальной машине.

Ваш XAML:

<Button x:Name"Button1" Command="{Binding MyCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" ..... />

VM:

    RelayCommand _myCommand;
    public ICommand MyCommand
    {
        get
        {
            if (_myCommand== null)
            {
                _myCommand= new RelayCommand(param =>
                {
                    if(((Button)param).Name == "Button1"){
                          //Do what you wish to do with Button1 Click
                     }
                });
            }
            return _myCommand;
        }
    }

Я не запускал этот код.Но решение находится на аналогичных линиях.Вы можете передать какой-то другой уникальный параметр вашей виртуальной машине, чтобы определить, какая кнопка сработала в этой команде.Я передаю саму кнопку в моем параметре.Вы также можете передать целое число и т. Д., Используя "clr-namespace:System;assembly=mscorlib"

0 голосов
/ 23 ноября 2018

Вам просто нужно установить PreviewMouseDown= на тот же метод.Я надеюсь, что я не ошибаюсь, но переменная e типа EventArgs может содержать информацию о кнопке, вызвавшей это событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...