2012-12-03 5 views
3

저는 WPF 및 MVVM을 처음 사용하므로 저와 함께 곰.WPF를 사용하여 명령 유효성 확인

기본적으로 사용자가 조직 세부 정보를 데이터베이스에 입력 할 수있게 해주는 응용 프로그램을 만들고 있습니다. 내가 만드는거야 내 WPF 응용 프로그램 내에서

, 나는 properties, commandsentity framework 방법을 포함하는 View Model이 (내가이 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}"/> 

는하지만 내가 달성하기 바라고 한번 사용자가 다음 명령이 모두 활성화되지 않고, 데이터베이스에 한 조직의 진입 점입니다 및 실수로 다른 조직에 들어가는에서 사용자를 방지 할 수 있습니다. 목적은 하나의 조직이 더 많거나 적게 추가되도록 허용하는 것입니다.

이것이 가능합니까?

+0

내가 찾고있는 내용인지 확실하지 않으므로 의견을 달아주세요. 당신이 필요로하는 것은 폼 유효성 검사에 의한 것이라고 생각합니다. 이 [기사] (http://www.scottlogic.co.uk/blog/colin/2009/01/bindinggroups-for-total-view-validation/)를보십시오. 답장을 보내 주셔서 감사합니다. – dowhilefor

+0

글쎄, 내 필드는 속성 검증을 사용하여 검증되었으므로 문제는 아닙니다. 난 단지 내 명령을 검증 할 수있는 방법을 원한다 그래서 그것은 데이터의 한 행 (데이터베이스 내에서), 가능한 플래그를 사용하여 입력 할 수 있습니까? 그러나 나는 이것을 달성하는 방법을 모른다. –

+0

IsEnabled 속성을 호출하는 속성에 바인딩하지 않는 이유 bool HasOrganisation {return mOrganisation.Count> 0;} 그리고 조직 속성이 변경되면이 값을 올립니다. 코드에 대한 정보가 없어도 좋은 답변을 제공합니다. 기껏해야 우리가하고 싶은 일에 대한 아주 작은 실행 가능한 예를 제공하십시오. – dowhilefor

답변

0

두 가지.

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); 
    } 

이 즉각적인 문제에 도움이되지 수 있지만, 특정 결합 할 수 있습니다로는, 코드를 더욱 재사용 할 것이다 : 1), I는 다음과 같이 조치를 취할 당신의 RelayCommand 편집을 권 해드립니다 요소를 ICommand의 매개 변수로 사용하여 CanExecute 테스트 및 실행 (또는 필요하지 않은 경우 ICommand.Execute의 개체 매개 변수로 null을 전달하고 View의 CommandParameter에 아무 것도 바인딩하지 않음)

또한 RelayCommand에서 다음과 같이 CanExecuteChanged를 재정의해야합니다.

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

이것은 ICommand를 트리거하여 사용자가 변경 한 사항을 CanExecute에 다시 확인합니다 (누락 된 부분 일 가능성이 큽니다).

마지막으로이 작업이 완료되면 CanExecute (CommandParameter 또는 VM의 무언가 중 하나)에 기준을 포함시키는 것만 큼 문제가됩니다.

이 정보가 도움이되기를 바랍니다.

관련 문제