2011-09-09 4 views
1

두 ICommand 개체는 모두 ViewModel에 바인딩됩니다.ViewModel에서 새 ICommand 개체 만들기

첫 번째 방법이 자주 사용되는 것 같습니다.

그러나 두 번째 코드는 일부 코드 줄을 저장하지만 Binding이 새로 고쳐지면 매번 새로운 ICommand 개체를 만들지 않으므로 리소스가 낭비되지 않습니까?!

private LightCommand _deleteDocumentCommand; 
     public LightCommand DeleteDocumentCommand 
     { 
      get { return _deleteDocumentCommand ?? (_deleteDocumentCommand = new LightCommand(() => DeleteDocument(),() => CanDeleteDocument)); } 
     } 

     public LightCommand DeleteDocumentCommand 
     { 
      get { return new LightCommand(() => DeleteDocument(),() => CanDeleteDocument); } 
     } 

답변

0

예. 한 번 인스턴스화하는 것이 더 좋습니다. 이렇게하면 다음과 같은 결과를 얻을 수 있습니다.

LightCommand DeleteCommand { get; set;} 

그런 다음 VM 인스턴스에서 사용자가 할당합니다. 또는 첫 번째 예를 사용할 수도 있습니다.

+0

당신이 제안한 것처럼 나는 그 접근법을 피하는 것이 좋기 때문에 - ?? – msfanboy

0

는 당신이 확인을 찾고있는 가정, 그것은 맞습니다 : 새 객체 인스턴스화,

매번 바인딩을 새로 고칠 때 (또는 명령이라고합니다). 그것은 자원의 분명한 낭비처럼 보입니다.

1

예 두 번째 방법은 명령이 참조 될 때마다 새 명령을 작성하지만 읽는 것이 더 쉬운 첫 번째 방법을 찾습니다. 뷰 모델에 명령을 할

내 선호하는 방법은

private LightCommand _deleteDocumentCommand; 
public LightCommand DeleteDocumentCommand 
{ 
    get 
    { 
     if (_deleteDocumentCommand == null) 
     { 
      _deleteDocumentCommand = new LightCommand(
       () => DeleteDocument(),() => CanDeleteDocument); 
     } 

     return _deleteDocumentCommand; 
    } 
} 

그것은 코드를 더 줄 수 있습니다이지만, 읽고 이해하기 쉽다. 게다가 일반적으로 내 모든 public Properties/Commands는 매크로에 의해 생성되고 ViewModel에서 작업 할 때마다 축소 된 #region Properties 영역으로 덤프되므로 get/set 메서드의 페이지를 스크롤 할 필요가 없습니다.

+0

"첫 번째 메서드는 개체가 처음"올바르지 않습니다. "라는 명령을받을 때 null을 반환합니다. null-Coalescing 연산자 "??" null가 ?? 뒤에 값을 돌려주는 경우 그래서 그것은 결코 null을 반환 할 수 없다. – msfanboy

+0

@msfanboy 맞아, 내 대답을 업데이트 할게. 나는 다른 것을 생각하고 있었다. – Rachel