我在.NET MAUI中有一个视图,其中包含一些按钮,如下所示:
<Button Text="d2" Command="{Binding RollCommand}" CommandParameter="2" />
<Button Text="d4" Command="{Binding RollCommand}" CommandParameter="4" />
<Button Text="d6" Command="{Binding RollCommand}" CommandParameter="6" />
<Button Text="d8" Command="{Binding RollCommand}" CommandParameter="8" />
<Button Text="d10" Command="{Binding RollCommand}" CommandParameter="10" />
<Button Text="d12" Command="{Binding RollCommand}" CommandParameter="12" />
<Button Text="d20" Command="{Binding RollCommand}" CommandParameter="20" />
为上面的视图设置了数据上下文:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DiceRoller2"
x:Class="DiceRoller2.MainPage">
<ContentPage.BindingContext>
<local:DiceRollerViewModel />
</ContentPage.BindingContext>
// ...
而命令是在这个视图模型中定义的:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using CommunityToolkit.Mvvm.ComponentModel;
namespace DiceRoller2
{
[INotifyPropertyChanged]
public partial class DiceRollerViewModel
{
public DiceRollerViewModel()
{
RollCommand = new Command<int>(Roll);
}
public int Dice { get; set; }
public string Result { get; set; }
public ICommand RollCommand { get; set; }
public void Roll(int sides)
{
var rolls = new List<int>();
for (var i = 0; i < Dice; i++)
{
rolls.Add(Random.Shared.Next(1, sides + 1));
}
Result = $"Rolled {Dice}d{sides} and got {string.Join(", ", rolls)} for a total of {rolls.Sum()}.";
}
}
}
但是,当我运行应用程序时,单击按钮什么也不做;即使我在Roll
方法中设置了断点,它也不会被命中,即使视图模型的构造函数中的断点确实被命中。
我可能遗漏了什么?为什么掷骰子的命令没有执行?不幸的是,Visual Studio中的WPF数据绑定调试选项似乎不适用于MAUI...
1条答案
按热度按时间h22fl7wq1#
首先,建议在MAUI项目中使用
MVVM
时使用CommunityToolkit.Mvvm
。然后我认为这个问题与
CommandParameter
有关,它应该是String
类型而不是Integer
.你可以参考我下面的代码片段:**1.**在项目中安装nuget包
CommunityToolkit.Mvvm
。**2.****检视:**主页面.xaml
在代码隐藏中,不要忘记使用绑定ViewModel:
**3.****检视模型:**骰子滚轮检视模型. cs
使用
MVVM
时,VM应按如下方式实现ObservableObject
:**4.**单击该按钮时,将在调试输出中触发该命令,如下所示: