Параметр команды wpf CheckBox - PullRequest
       58

Параметр команды wpf CheckBox

0 голосов
/ 06 августа 2020

В моем представлении у меня есть 8 флажков, все привязаны к другому свойству в модели, скажем, bool port1 ... port8. Свойство изменяется при нажатии соответствующего флажка. Когда пользователь устанавливает или снимает отметку с одного из этих флажков, я также выполняю связанную команду SetPortCommand. Команда выполняет функцию типа SetPort(uint numPort, bool set) Мое представление выглядит так:

<CheckBox x:Name="cbPort1" Content="port1" Command="{Binding SetPortCommand}">
    <CheckBox.IsChecked>
        <Binding Path="MyModel.Port1"/>
    </CheckBox.IsChecked>
</CheckBox>

За всем этим стоит довольно медленное оборудование, поэтому я бы не хотел вызывать функцию SetPort() для каждого порта. Я мог бы использовать 8 команд, например от SetPortCommand1 до SetPortCommand8, но это вызывает много повторяющегося кода. У меня были следующие идеи, но я не знаю, как их реализовать, и ни одна из них не будет соответствовать MVVM. 8 портов, которые следует установить или снять. Есть ли простой способ сделать это?

Идея заключалась бы в том, чтобы каким-то образом использовать событие OnPropertyChanged () для вызова функции здесь.

Любая помощь приветствуется: -)

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Вы можете избежать выполнения команды и просто вызвать свой метод из каждого установщика, например:

private bool _port1;
public bool Port1
{
    get { return _port1; }
    set { _port1 = value; SetPort(); }
}

Если SetPort изменяет другие свойства, вы можете использовать флаг, чтобы определить, должно ли оно быть invoked:

private bool _setPort = true;

private bool _port1;
public bool Port1
{
    get { return _port1; }
    set
    { 
        _port1 = value;
        if (_setPort)
        {
            _setPort = false;
             SetPort(); 
            _setPort = true;
        }
    }
}

Вы можете сделать то же самое в методе Execute своей команды, если по какой-то причине все еще хотите использовать команду.

Поле _setPort предотвращает вызов метода для каждого свойства источника.

В качестве альтернативы, вы также можете избежать установки свойства в методе и вместо этого установить поле поддержки и вызвать событие PropertyChanged: _port2 = true; OnPropertyChanged (nameof (Port2));

Это позволит обойти установщик и избежать вызова метода.

0 голосов
/ 06 августа 2020

При использовании флажка обычный подход состоит в том, чтобы привязать ischecked и действовать в этом установщике. Здесь используется текст, а не bool, но вы можете видеть, что в установщике вызывается метод. https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Change_of_Variable

У вас есть повторяющаяся группа функций в этом наборе флажков.

Обычный подход - привязать список или наблюдаемую коллекцию моделей просмотра к источнику элемента элемента управления. Шаблон этих данных в вашем пользовательском интерфейсе. Здесь у вас будут флажки. Каждая из ваших моделей просмотра строк будет содержать данные о порте. Имя и еще много чего.

Если вам особенно нужна команда, вы можете связать ICommand, например, delegatecommand или relaycommand, из:

Модель просмотра строки - в этом случае она "знает", какой порт действовать. И ваш код, который делает что-то с этим портом, находится в модели просмотра строки.

или

В модели просмотра окна, и в этом случае модель просмотра строки является текстом кнопки, и это передается как параметр для ICommand.

Оба они являются обычным сценарием ios работа с кнопками, и вы сможете найти код в Google.

Привязка IsChecked будет проще и, следовательно, более обычна, хотя .

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