3

我是 WPF 和 MVVM 的新手,所以请多多包涵。

基本上,我正在创建一个应用程序,使用户能够将他们的组织详细信息输入数据库。

在我正在创建的 WPF 应用程序中,我有一个View Model包含properties,commandsentity framework方法(我知道这不是使用 MVVM 的正确方法,但我正在慢慢学习如何实现它)。

在我的一个视图中,它是一个选项卡控件,允许用户在数据库中输入不同的组织详细信息,然后在另一个视图中,我有一个数据网格来显示他们输入的内容,以便用户在何时更新内容需要。

这引出了我的问题。到目前为止,我已经验证了我的命令,以便当某些字段为空时,按钮将不会处于活动状态,但一旦输入,它们就会被激活。像这样;

           private ICommand showAddCommand;
    public ICommand ShowAddCommand
    {
        get
        {
            if (this.showAddCommand == null)
            {
                this.showAddCommand = new RelayCommand(this.SaveFormExecute, this.SaveFormCanExecute);//i => this.InsertOrganisation()
            }

            return this.showAddCommand;
        }
    }

    private bool SaveFormCanExecute()
    {
        return !string.IsNullOrEmpty(OrganisationName) && !string.IsNullOrEmpty(Address) && !string.IsNullOrEmpty(Country) && !string.IsNullOrEmpty(Postcode)
            && !string.IsNullOrEmpty(PhoneNumber) && !string.IsNullOrEmpty(MobileNumber) && !string.IsNullOrEmpty(PracticeStructure) && !string.IsNullOrEmpty(PracticeType) && !string.IsNullOrEmpty(RegistrationNumber); 
    }

    private void SaveFormExecute()
    {
        InsertOrganisations();
    }

  Xaml:
  <Button Content="Save" Grid.Column="1" Grid.Row="18" x:Name="btnSave" VerticalAlignment="Bottom" Width="75" Command="{Binding ShowAddCommand}"/>

但我希望实现的是,一旦用户在 1 个组织中进入数据库,则该命令不会完全激活并防止用户意外进入另一个组织。目的是只允许添加 1 个组织,不多也不少。

这可能吗?

4

1 回答 1

0

两件事情。1),我建议编辑您的 RelayCommand 以采取如下操作:

    private Action<object> _execute;
    private Predicate<object> _canExecute;

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    //[DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

这可能对您的直接问题没有帮助,但它会使您的代码更可重用,因为您将能够将视图中的某些元素绑定为 ICommand 中的参数,用于 CanExecute 测试和执行(或者如果您不需要这个,只需将 null 作为 ICommand.Execute 中的对象参数传递,并且不要将任何内容绑定到视图中的 CommandParameter)

此外,在您的 RelayCommand 中,确保您覆盖 CanExecuteChanged,如下所示:

    public override event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

这将触发您的 ICommand 在用户进行更改时重新检查 CanExecute(并且很可能是您遗漏的部分)。

最后,一旦完成,只需将您的条件包含在 CanExecute 中(来自 CommandParameter 或来自 VM 中的某些内容)。

我希望这有帮助。

于 2012-12-03T19:10:37.450 回答