首页 > 解决方案 > 如何使用 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";
                }
            });
        }
    }

标签: c#xamarinxamarin.formsmvvmdata-binding

解决方案


Xamarin 中的命令实现该ICommand接口。

public interface ICommand
{
    public void Execute (Object parameter);

    public bool CanExecute (Object parameter);

    public event EventHandler CanExecuteChanged;
}

如果您将按钮中的命令绑定到实现的视图模型ICommand,只需设置CanExecutefalse. 您应该在视图模型中执行此操作,而不是视图。

将事件绑定到按钮或使用Command. 不要两者都做。 如果您需要更改按钮颜色,请将按钮颜色设置为与 View Model 的属性的绑定,以便您可以在那里进行更改。


推荐阅读