2011-07-08 78 views
2

我想實現一個WPF MVVM應用程序。我是這個平臺的初學者。所有我需要的是落實我SaveCommandWPF MVVM CanExecute方法實現問題

這裏一個CanExecute方法是代碼

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#視圖模型代碼

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它的工作原理精細。設置完CanSaveExcute後,該按鈕保持禁用狀態,並且不會對文本更改啓用。據我所知,這是一條路。

請告訴我我做錯了什麼。

感謝

+0

不確定DelegateCommand是如何實現的,但通常情況下,如果您在此情況下讓Command接受參數(對象),則在xaml中應該還有一個CommandParameter。沒有,因此可能無法調用CanSaveExcute(object obj),因爲綁定機制不知道要傳遞什麼參數。你嘗試使用不帶參數的命令嗎? – stijn

+0

問題是UpdateSourceTrigger = PropertyChanged不改變PropertyChange上的屬性。它應該改變名字字段和姓氏字段,因爲我在文本框上鍵入,但那不會發生。 – thewayman

回答

3

你也應該提高「CanExecuteChanged」事件,否則接收器將不得不永久重溫你的命令,以找出是否可以執行。您可以使用「RaiseCanExecuteChanged」的方法,描述here

編輯 如果你不介意的開銷,你可以叫你this.SaveCommand.RaiseCanExecuteChanged()在物業制定者調用RaisePropertyChanged("FullName");後。如果您的RaisePropertyChanged方法是虛擬的,則可以將其放置爲RaiseCanExecuteChanged()

+0

謝謝!但可以給我更多的細節。我不知道該怎麼做。 – thewayman

+0

問題是UpdateSourceTrigger = PropertyChanged不改變PropertyChange上的屬性。它應該改變名字字段和姓氏字段,因爲我在文本框上鍵入,但那不會發生。 – thewayman

+0

謝謝! this.SaveCommand.RaiseCanExecuteChanged()工作!如果你的RaisePropertyChanged方法是虛擬的,你可以放置RaiseCanExecuteChanged()他們的 – thewayman