2009-08-10 10 views
6

이 질문이 이전에 논의되었거나 가까운 거대한 프리즘 및 mvvm 블로그에서 간접적으로 대답되었는지 엄격하게 판단하지 마십시오. RelayCommand 또는 WPF DelegateCommand 클래스 구현에서 는 이러한 핸들러Silverlight의 MVVM (ICommand)

/// <summary> 
/// Occurs whenever the state of the application changes such that the result 
/// of a call to <see cref="CanExecute"/> may return a different value. 
/// </summary> 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

존재하지만 네임 SL의 서브 세트에서 어떤 명령 관리자 클래스 없다. 그리고 이것은 내가 붙어있는 곳입니다. 아직 SL에 대한 MVVM 채택에서이 문제를 해결하지 못했습니다 (PRISM은 아직 너무 복잡합니다). 다른 간단한 HelloWorldMVVM 앱은 전혀 처리하지 못합니다.

미리 감사드립니다. 내 영어를 유감스럽게 생각합니다. -

답변

5

Silverlight에서 명령을 지원하지 않습니다. 사용자가보기에서 컨트롤을 조작하면보기 용 코드 숨김에서보기 모델을 수정하는 코드 (예 : 이벤트 처리기)를 작성해야합니다. 사용자가보기에서 단추를 클릭 할 때보기 모델에서 메서드를 호출하는 것처럼 간단 할 수 있습니다. PRISM을 사용하면 XAML에서 뷰에 대한 연결된 속성을 만들어 이러한 이벤트 처리기를 제거 할 수 있지만 PRISM을 사용하지 않으려면 단순히 이벤트 처리기를 사용해야합니다.

당신이 처리해야 할 다른 한 가지 측면은보기 모델이 변경 될 때보기를 수정하는 것입니다. 특히보기 모델의 상태에 따라 컨트롤을 사용하거나 사용하지 않도록 설정하는 것이 좋습니다. 이를 위해서는 컨트롤의 IsEnabled 속성을 특정 작업이 허용되는 경우 반영하는 뷰 모델의 속성에 바인딩해야합니다. 부울 값으로 변환하는 사용자 정의 IValueConverter 객체를 구현하는 것이 종종 유용합니다. 예를 들어, 뷰 모델에 개수를 나타내는 속성이 있고 개수가 0보다 큰 경우에만 뷰의 특정 컨트롤을 사용하려면 숫자가 클수록 true으로 변환되는 값 변환기를 만들 수 있습니다 0보다 크고 바인딩에서이 값 변환기를 사용하십시오.

MVVM 응용 프로그램의 WPF 예제를 적용하려고하면 모든 명령 사용을 제거하고 자신의 코드를 대체해야합니다. 예제의 코드는 Silverligt에서는 의미가 없지만 WPF에서는보기의 컨트롤이 활성화되어 있고 표시되는지 여부를 확인하는 과정에 참여합니다.

+0

Silverlight 2에 ICommand (제한적일 수 있지만 ICommand 클래스가 있음)의 지원이 있습니다. –

+1

'ICommand' 인터페이스가 Silverlight에서 정의되었지만 그것은 어디에서나 사용되지 않으며 MVVM 패턴과 잘 작동하는 WPF의 전체 지휘 인프라는 Silverlight에는 없습니다. –

+0

감사합니다. 나는 ICommand의 존재가 완전한 지휘 지원을 의미한다고 생각했기 때문에 잘못된 것이 었습니다. (그래서, SL에서 MVVM을 구현하는 것이 WPF처럼 쉽지 않은 것으로 나타났습니다. 지금까지 한 가지 방법 만 찾았습니다. 연결된 속성과 행동을 사용했습니다. 이 : http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ 또는 많은 이벤트가 포함 된 준비된 프레임 워크를 사용하십시오. http : // nroute. codeplex.com –

5

Silverlight 4.0은 ICommand 인터페이스를 지원하므로 WPF 인프라와 같은 지휘.