c# - 如何使用 C# 阻止按钮在 Xamarin.Forms 中执行绑定命令?
问题描述
我创建了一个在“编辑”和“保存”之间切换的按钮。这个按钮有一个数据绑定到我的 ViewModel 中的“保存命令”。
我想停止执行“保存命令”,直到按钮文本等于“保存”。
我试过切换Command.CanExceute(false)
,但这似乎不起作用,“保存命令”总是执行!示例代码发布在下面,也可以在我的GitHub 存储库中找到
主页.xaml
<ContentPage.BindingContext>
<App:ClientViewModel/>
</ContentPage.BindingContext>
<StackLayout>
<Button x:Name="EditSaveButton"
Text="Edit"
Command="{Binding SaveClient}"
Clicked="EditSaveButton_Clicked"/>
</StackLayout>
MainPage.xaml.cs
public MainPage()
{
InitializeComponent();
EditSaveButton.Command.CanExecute(false);
}
private void EditSaveButton_Clicked(object sender, EventArgs e)
{
if (EditSaveButton.Text == "Edit")
{
EditSaveButton.Text = "Save";
EditSaveButton.Command.CanExecute(true);
}
else
{
EditSaveButton.Text = "Edit";
EditSaveButton.Command.CanExecute(false);
}
}
客户端视图模型.cs
public class ClientViewModel
{
public Command SaveClient { get; set; }
public ClientViewModel()
{
SaveClient = new Command( async () => {
await Application.Current.MainPage.DisplayAlert("Saved", "Client Saved", "OK");
});
}
}
###### 更新 ######
感谢 Jason 和 Robert Harvey 对此的指导。我已将代码更改为仅使用Command
而不是Clicked
将按钮的文本属性绑定到我的 ViewModel 中的属性。但是,当我执行代码时,按钮文本没有更新?任何想法为什么?
主文件
<StackLayout>
<Button x:Name="EditSaveButton"
Text="{Binding EditSaveButtonText}"
Command="{Binding SaveClient}"/>
</StackLayout>
客户端视图模型.cs
public class ClientViewModel
{
public Command SaveClient { get; set; }
public string EditSaveButtonText { get; set; }
public ClientViewModel()
{
SaveClient = new Command( () => {
if (EditSaveButtonText == "Edit")
{
EditSaveButtonText = "Save";
}
else
{
EditSaveButtonText = "Edit";
}
});
}
}
解决方案
Xamarin 中的命令实现该ICommand
接口。
public interface ICommand
{
public void Execute (Object parameter);
public bool CanExecute (Object parameter);
public event EventHandler CanExecuteChanged;
}
如果您将按钮中的命令绑定到实现的视图模型ICommand
,只需设置CanExecute
为false
. 您应该在视图模型中执行此操作,而不是视图。
将事件绑定到按钮或使用Command
. 不要两者都做。 如果您需要更改按钮颜色,请将按钮颜色设置为与 View Model 的属性的绑定,以便您可以在那里进行更改。
推荐阅读
- javascript - 如何根据 CSS 变换使 div 标签移动:rotate(); 财产?
- typescript - 如何在声明中键入速记
- ios - xamarin 表单 ios Iphone 未收到 firebase 通知
- go - 处理地图中的零值
- python - libc++abi.dylib:由于 pygame,以 NSException 类型的未捕获异常终止
- php - 配置文件路径的PHP“无值”
- json - Django将两个json对象组合成一个新数组
- swift - 添加值时的金属浮点精度
- swift - 将可选类型转换为非可选类型
- applescript - Applescript 保存到剪贴板而不是桌面