3

私はWPFとMVVMを初めて使用するので、我慢してください。

基本的に、ユーザーが組織の詳細をデータベースに入力できるようにするアプリケーションを作成しています。

作成しているWPFアプリケーション内に、、およびメソッドView Modelを含むがあります(これがMVVMを使用する正しい方法ではないことはわかっていますが、それを実現する方法をゆっくりと学んでいます)。propertiescommandsentity framework

私のビューの1つでは、これはタブコントロールであり、ユーザーがデータベースにさまざまな組織の詳細を入力できるようにします。次に、別のビューでは、ユーザーが入力した内容を表示するデータグリッドがあり、ユーザーがコンテンツを更新できるようにします。必要です。

それが私の質問につながります。これまでのところ、コマンドを検証して、特定のフィールドが空の場合、ボタンはアクティブになりませんが、入力するとアクティブになるようにしました。そのようです;

           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

2つのこと。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);
    }

これは当面の問題には役立たないかもしれませんが、CanExecuteテストと実行の両方でICommandのパラメーターとしてビューから特定の要素をバインドできるため、コードをより再利用可能にします(またはこれが必要ない場合) 、ICommand.Executeのオブジェクトパラメータとしてnullを渡すだけで、ビューの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 に答える