2011-07-08 76 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