2011-12-01 3 views
1

DelegateCommand 속성을 사용하여 ButtonCommand 속성에 바인딩하는 ViewModel이 있습니다.PRISM DelegateCommand + 샘플 데이터

문제는 샘플 데이터가 DelegateCommand 개체를 좋아하지 않는다는 것입니다. 그것은 불평한다 : The type "DelegateCommand" does not include any accessible constructors. 또한 노출 유일한 속성은 IsActive 속성입니다.

<local:MyViewModel xmlns:local="clr-namespace:MyNamespace" 
        xmlns:prism="http://www.codeplex.com/prism"> 
    <local:MyViewModel.Age>47</local:MyViewModel.Age> 
    <local:MyViewModel.PurchaseAlcohalCommand> 
     <prism:DelegateCommand IsActive="True" /> 
    </local:MyViewModel.PurchaseAlcohalCommand> 
</local:MyViewModel> 

답변

1

DelegateCommand 대신 ICommand를 표시하도록보기 모델을 변경하십시오. DelegateCommand는 단지 ICommand의 구현입니다. 나중에 MvvmLight에서 RelayCommand로 전환하려면보기와 샘플 데이터가 신경 쓸 필요가 없습니다.

나는 이것이 당신의 문제를 해결할 지 확신하지 못하지만, 그럴 수도 있다고 생각합니다. 게다가 좋은 프로그래밍 습관 일뿐입니다.

+0

내 DelegateCommand를 비공개로 설정하고 명령을 ICommand로 캐스팅하는 "래퍼"속성을 노출하려고 생각한 경우 ICommand의 일부가 아니기 때문에 'PurchaseAlcohalCommand.RaiseCanExecuteChanged()'와 같은 호출을 수행 할 수 없습니다. 인터페이스를 사용하려고 할 때마다 DelegateCommand로 다시 캐스팅하지 않아도됩니다. –

+0

아, CommandManager 클래스에 의존하기 때문에 RelayCommand를 사용할 계획이 없습니다. –

+0

이것은 대개 내 명령을 표시하는 방법이며 샘플 데이터에서이 문제를 보지 못했습니다. 그래서 나는 어느 문제가 당신을 더 괴롭 히 느냐고 추측한다. 일반적으로 나는 당신이 발견 한 문제로 인해 다른 사람들이 ICommand를 구현하는 것을 피합니다 : 명령 객체에 상태를 업데이트하도록 알리기가 어렵습니다. OO 설계 원칙 (특히 캡슐화)에 따르면, 명령 자체는 업데이트시기를 알아야합니다. 업데이트하라는 메시지는 필요하지 않습니다. –

1

DelegateCommand의 설정 방식은 활성화되었을 때 아무 작업도 수행하지 않습니다. 그것이 바람직한 행동이라면, 제 제안은 단순히 그것을 선언하지 않는 것입니다. WPF는 nullICommand 개체에 바인딩되는 것을 정상적으로 처리합니다.

또는 인스턴스화 된 DelegateCommand에 바인딩해야 할 경우 DelegateCommand의 하위 클래스로 매개 변수없는 생성자를 포함 할 수 있습니다. 조금 더 복잡 얻을 것

당신이이 DelegateCommand에 결합하고 싶어하고 명령이 트리거 될 때 DelegateCommand 실제로 뭔가를 할 것을 원하는 경우. 앞에서 언급 한 하위 클래스 DelegateCommand을 사용해야하지만 XAML에서도 대리자를 정의 할 수 있어야합니다. 거기에 샘플이 있다고 생각합니다.하지만 마크 업 확장과 그 자연의 것들을 포함한다고 생각합니다. 이 방법에 대한 귀하의 투자 수익 (ROI)은 약간 낮지 만, 귀하의 마일리지는 다를 수 있습니다. 이것은 일반적으로 처리 있는 방법입니다

마지막 대안 : 정의 당신의 당신의 ViewModel의 생성자에서 DelegateCommands.

+0

디자인 타임 명령을 작동시킬 수있는 MarkupExtension을 사용하여 DelegateCommand를 서브 클래스로 만들면 어떻게됩니까? 즉, 샘플 데이터가 실패하면 CanExecute 버튼이 내 샘플 데이터를 기반으로 모두 비활성화됩니다. –

+0

@ m-y : 예, 기술적으로 가능합니다. 그러나 ViewModel의 기본 생성자에서 동일한 DelegateCommand를 정의하면 똑같은 결과를 얻을 수 있으며 모든 것을 XAML로 구속하는 방법을 파악할 필요가 없습니다. 그냥 친절한 제안. 나는 이것이 당신에게 몇 번 제안되었다는 것을 안다. 그럴만한 이유가 있습니다. –