如何使用DelegateCommnad发送多个参数

时间:2019-05-20 07:23:06

标签: xamarin mvvm xamarin.forms prism

我在Button单元格中有ListView。在按钮上单击,我需要从ViewModel执行两个操作

  • 获取当前记录(以对数据进行修改)
  • 获取当前的单元格/视图(以修改文本,按钮的bg颜色)

但是,我可以通过分别传递DelegateCommandStudent参数来使用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>

如果您看到上面的代码,我有两种方法SetBtnTextBtnClicked如何通过在Student中一次传递objectDelegateCommand参数来将这两种方法合并为一个

1 个答案:

答案 0 :(得分:1)

您应该将视图的属性绑定到视图模型。然后将视图模型作为命令参数传递,并更改要在命令中更改的任何内容,数据绑定将自动更新视图。

示例:

<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(很可能是模型的一部分),而没有出现{ {1}}。您知道,您不会直接绑定到模型,除非它是一个琐碎的玩具项目。