2011-07-08 14 views
2

WPF MVVMアプリケーションを実装しようとしています。私はこのプラットフォームの初心者です。私は必要なのは私のSaveCommandここWPF MVVM CanExecuteメソッド実装の問題

ためCanExecuteメソッドを実装することであることは、それが動作CanSaveExcuteことができなければ、コード

WPFのXMLコード

 <Canvas Height="283" Name="canvas1" Width="321"> 
      <Label Canvas.Left="6" Canvas.Top="6" Content="First Name" Height="25" Width="91" /> 
      <Label Canvas.Left="6" Canvas.Top="37" Content="Last Name" Height="25" Width="91" /> 
      <TextBox Canvas.Left="103" Canvas.Top="10" Height="21" Width="199" Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged}"/> 
      <TextBox Canvas.Left="103" Canvas.Top="37" Height="21" Width="199" Text="{Binding Path=LastName, UpdateSourceTrigger=PropertyChanged}"/> 
      <Button Canvas.Left="228" Canvas.Top="241" Content="Save" Height="23" Width="74" Command="{Binding SaveCommand}" /> 
      <TextBlock Canvas.Left="28" Canvas.Top="110" Height="19" Width="259" Text="{Binding Path=FullName}"/> 
     </Canvas> 

C#のViewModelコード

public CustomerViewModel(IEventAggregator eventAggregator, IUnityContainer container, ILoggerFacade logger) 
     : base(eventAggregator, container, logger) 
    { 
     logger.Log("View Model Initialized", Category.Debug, Priority.None); 
     InitializeCommands(); 
    } 

    public DelegateCommand<object> SaveCommand { get; set; } 

    private string firstName; 

    public string FirstName 
    { 
     get { return firstName; } 
     set { 
      firstName = value; 
      RaisePropertyChanged("FirstName"); 
     } 
    } 

    private string lastName; 

    public string LastName 
    { 
     get { return lastName; } 
     set { 
      lastName = value; 
      RaisePropertyChanged("LastName"); 
     } 
    } 
    private string fullName; 

    public string FullName 
    { 
     get { return fullName; } 
     set { 
      fullName = value; 
      RaisePropertyChanged("FullName"); 
     } 
    } 


    private void InitializeCommands() 
    { 
     SaveCommand = new DelegateCommand<object>(OnSaveCommand, CanSaveExcute); 

    } 
    private bool CanSaveExcute(object obj) 
    { 
     if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName)) 
      return false; 
     return true; 
    } 

    private void OnSaveCommand(object obj) 
    { 
     FullName = FirstName + " " + LastName; 
    } 

です良い。 CanSaveExcuteを設定すると、ボタンは無効のままになり、テキストの変更が有効になりません。私が学んだ限り、これは行く方法です。

私が間違っていることを教えてください。

おかげ

+0

DelegateCommandがどのように実装されているのかわからないのですが、通常は、この場合引数(オブジェクト)を受け入れるようにすると、xamlにもCommandParameterが必要です。何もないので、おそらくCanSaveExcute(オブジェクトobj)は、バインディングのメカニズムがないので呼び出すことができません;引数として渡すものを知っていません。あなたはパラメータなしのコマンドで試してみませんか? – stijn

+0

問題はUpdateSourceTrigger = PropertyChangedはPropertyChangeのプロパティを変更していません。私はテキストボックスに入力するようにファーストネームフィールドとラストネームフィールドを変更する必要がありますが、それは起こっていません。 – thewayman

答えて

3

また、それを実行できるかどうかを調べるために、そうでない場合は、受信機が永久にコマンドを再検討しなければならないであろう、「CanExecuteChanged」イベントを発生させる必要があります。あなたは「RaiseCanExecuteChanged」メソッドを使用することができ、あなたはオーバーヘッドを気にしない場合は、あなただけのプロパティのセッターでRaisePropertyChanged("FullName");へお電話の後this.SaveCommand.RaiseCanExecuteChanged()を呼び出すことができます 編集here

を説明しました。 RaisePropertyChangedメソッドが仮想の場合は、RaiseCanExecuteChanged()を配置することができます。

+0

ありがとう!しかし、私に詳細を教えてください。私はそれをどうやって行うのか分かりません。 – thewayman

+0

問題はUpdateSourceTrigger = PropertyChangedはPropertyChangeのプロパティを変更していません。私はテキストボックスに入力するようにファーストネームフィールドとラストネームフィールドを変更する必要がありますが、それは起こっていません。 – thewayman

+0

ありがとう! this.SaveCommand.RaiseCanExecuteChanged()が機能しました! RaisePropertyChangedメソッドが仮想であれば、RaiseCanExecuteChanged()を配置することができます。 – thewayman

関連する問題