【发布时间】:2021-07-13 04:54:12
【问题描述】:
我创建了一个在“编辑”和“保存”之间切换的按钮。此按钮与我的 ViewModel 中的“保存命令”有数据绑定。
我想停止执行“保存命令”,直到按钮文本等于“保存”。
我尝试切换Command.CanExceute(false),但这似乎不起作用,“保存命令”总是执行!示例代码发布在下面,也可以在我的GitHub Repositry
MainPage.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);
}
}
ClientViewModel.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 中的属性。但是,当我执行代码时,按钮文本没有更新?任何想法为什么?
Main.xaml
<StackLayout>
<Button x:Name="EditSaveButton"
Text="{Binding EditSaveButtonText}"
Command="{Binding SaveClient}"/>
</StackLayout>
ClientViewModel.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";
}
});
}
}
【问题讨论】:
-
不要使用命令和单击,选择一种方法。如果您将按钮 Text 绑定到 VM 属性,则您的 VM 可以确定它所处的状态并采取适当的行动
-
感谢 Jason,因为我的代码需要执行 ViewModel 中可用的一些逻辑(将记录保存到数据库),我将选择命令选项。但是我提供的代码并不完整,我还需要在视图中执行一些逻辑,例如更新按钮颜色等。
-
您可以将颜色绑定到 VM 属性并使用 ValueConverter
-
谢谢杰森,我已经更新了我的问题以包含您的更改,但按钮文本没有更新?任何想法为什么?
-
你的虚拟机需要实现 INotifyPropertyChanged
标签: c# xamarin xamarin.forms mvvm data-binding