我在Button
单元格中有ListView
。在按钮上单击,我需要从ViewModel执行两个操作
但是,我可以通过分别传递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
参数来将这两种方法合并为一个?
答案 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}}。您知道,您不会直接绑定到模型,除非它是一个琐碎的玩具项目。