Как отправить более одного параметра с DelegateCommnad - PullRequest
0 голосов
/ 20 мая 2019

У меня есть Button в ListView ячейке.При нажатии кнопки мне нужно выполнить два действия из ViewModel

  • Получить текущую запись (чтобы внести изменения в данные)
  • Получить текущую ячейку / представление (чтобы изменить текст, цвет bgкнопки)

Однако я могу выполнить одно действие за раз, используя DelegateCommand, передав параметры Student и object соответственно.См. Мой код ниже

public StudentAttendanceListPageViewModel()
{
    //BtnTextCommand=new DelegateCommand<object>(SetBtnText);
    ItemCommand=new DelegateCommand<Student>(BtnClicked);
}

public DelegateCommand<object> BtnTextCommand { get; private set; }

public void SetBtnText(object sender)
{
    if (view.Text == "P")
    {
        view.Text = "A";
        view.BackgroundColor= (Color)Application.Current.Resources["lighRedAbsent"];               
    }
}

public DelegateCommand<Student> ItemCommand { get; }
public void BtnClicked(Student objStudent)
{
    objStudent.AbsentReasonId="1001";
    objStudent.AttendanceTypeStatusCD = "Absent";
    objStudent.AttendanceTypeStatusId = "78001"
}

Это Button код

<Button x:Name="mybtn"                                
    Command="{Binding Source={x:Reference ThePage}, Path=BindingContext.ItemCommand}"
    CommandParameter="{Binding .}"            
    BackgroundColor="{DynamicResource CaribGreenPresent}"
    Text="{Binding AttendanceTypeStatusId, Converter={x:StaticResource IDToStringConverter}}">
</Button>

Если вы видите код выше, у меня есть два метода SetBtnText и BtnClicked. Как я могу объединить эти два метода в один , передавая параметры Student и object одновременно в DelegateCommand?

1 Ответ

1 голос
/ 20 мая 2019

Вы должны привязать свойства вида к модели вида. Затем передайте модель представления в качестве параметра команды и измените все, что вы хотите изменить в команде, и привязка данных автоматически обновит представление.

Пример:

<Button Command="{Binding SomeCommand}"
        Text="{Binding Text}">
</Button>

public class StudentViewModel
{
    public StudentViewModel( Student student )
    {
        _text = $"Kick {student.Name}";
        SomeCommand = new DelegateCommand( () => {
                                                     Text = "I have been kicked"
                                                     student.Exmatriculate();
                                                     SomeCommand.RaiseCanExecuteChanged();
                                                 },
                                           () => student.IsMatriculated
                                         );
    }

    public DelegateCommand SomeCommand { get; }
    public string Text
    {
        get => _text;
        set => SetProperty( ref _text, value );
    }

    private string _text;
}

Как уже отмечалось в комментариях, никогда не требуется передавать представление в модель представления . Для меня это выглядит так, как будто у вас нет модели представления в первую очередь, так как ваш код упоминает только Student (что, скорее всего, является частью модели), в то время как StudentViewModel не встречается , Знаешь, ты не привязываешься к модели напрямую , если это не тривиальный игрушечный проект.

...