Arvind Chourasiya
Arvind Chourasiya

Reputation: 17462

How to send more than one param with DelegateCommnad

I have Button in ListView Cell. On button click I need to perform two actions from ViewModel

However, I am able to perform single action at a time using DelegateCommand by passing Student and object param respectively. See my code below

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"
}

This is Button code

<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>

If you see above code I have two methods SetBtnText and BtnClicked. How can I merge these two methods into one by passing Student and object params at a time in DelegateCommand?

Upvotes: 0

Views: 129

Answers (1)

Haukinger
Haukinger

Reputation: 10883

You should bind the view's properties to the view model. Then pass the view model as command parameter and change whatever you want to change in the command and data binding will automatically update the view.

Example:

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

As stated in the comments already, it's never ever necessary to pass the view to the view model. To me, it looks as if you don't have a view model in the first place, though, as your code only mentions Student (which most likely is part of the model), while there's no occurence of a StudentViewModel. You know, you do not bind to the model directly unless it's a trivial toy project.

Upvotes: 1

Related Questions