2012-07-14 2 views
0

MVVM 설계 모델을 잘 이해하고 있다고 생각합니다. 그러나 WPF, 명령 바인딩 및이를 사용하는 방법과 관련하여 엠파이어가 있습니다.MVVM - WPF 명령 바인딩 표준에 관한 내용

명령을 XAML에 직접 바인딩하기 위해 ViewModel 내에 ICommand 인터페이스를 구현합니다. 이제 ICommand 인터페이스는 PresentationCore.DLL의 일부입니다. 잘못된 부분이 기본 .NET Framework가 아닌 WPF의 일부인 경우 수정하십시오.

ViewModel과 Model의 전체적인 점이 완전히 UI 독립적이지 않아야합니까? 예를 들어, ICommand를 내 ViewModel에 구현하고이를 데이터 컨텍스트로 사용하여 XAML에서 명령을 바인딩하면 내 ViewModel이 WPF 프레임 작업 (특히 PresentationCore.Dll)에 종속되지 않습니다.

내 모델과 뷰 모델을 사용하여 Windows Forms 환경을 사용하려고하면 Windows Forms를 사용하기 때문에 PresentationCore.DLL을 참조해야합니다. WPF 프레임 워크가 아닙니다.

내게 조금 이상하게 보입니다. 여기에 뭔가 빠졌습니까? 내 Model과 ViewModel을 완전히 UI와 UI Framework 독립적으로 유지하기 위해해야하는 또 다른 방법이 있습니까? 그렇지만 여전히 XAML에서 Command 바인딩을 사용할 수 있습니까?

미리 감사드립니다.

+0

, 가지고 XXXViewModel과 XXXViewModel에서 상속하고 모든 ICommand 관련 항목이 포함 된 XXXViewModelWPF이면 XXXViewModelWPF 클래스는 단순히 WPF가됩니다. 더 좋은 방법이 있습니까?감사합니다 –

답변

1

또한 이런 종류의 문제가 있지만 wpf가 아니라 POCO 클래스에서 발생했습니다. 내가 한 것은 두 개의 다른 어셈블리에서 두 개의 부분 클래스를 만들었습니다. 당신이 당신의 VM 프로젝트에 의존하는 presentationcore.dll이 아닌 하나의 부분 클래스를 생성하고 다른 어셈블리 (예 : WPFVM)에 부분 클래스를 생성하여 ICommand 물건을 구현합니다. 이제 Winforms 물건에 대해서만 View 프로젝트에 VM 프로젝트 참조를 추가하고 WPF에 대해서는 VM 및 WPFVM의 참조를 View 프로젝트에 추가합니다. 이것이 도움이되기를 바랍니다.

+0

감사합니다 ethicallogics, 나는 이미 그것을하기로 결정했다. 대신에 ICommand 속성을 가진 XXXViewModelWPF라는 각 ViewModel에 대한 자손 클래스를 만들기 위해 Partial 클래스를 사용했다. 앞에서 말했듯이이 방법을 사용하면 Windows Forms 구현에서 XXXViewModelWPF를 처리하지 않아도됩니다! 그 좋은 생각, 고마워. –

1

MVVM의 요점은보기 만보기와 아무것도 아닌 것입니다. ICommands를 뷰 모델에 넣으면 코드가 뷰에서 벗어나게됩니다. 문제가 발생하는 곳은 의존성 프로퍼티가 아닌 뷰에있는 어떤 것에 액세스해야한다면 바인딩 할 수 없다는 것입니다.

+0

대답 주셔서 감사합니다, 그래서 MVVM 모델의 나의 해석은 올바르지 않습니까? ViewModel의 요점은 뷰를 로직에서 추상화하는 것이 아니라 뷰에서 모든 코드를 제거하는 것입니다. 따라서 내 프로그램을 Windows Forms로 옮기려면 Views뿐 아니라 ViewModels와 Views를 다시 작성해야합니까? UI 디자인이 변경 될 때 필요한 재 작업을 제한하는 디자인 패턴의 포인트를 생각해 보았습니다. –

+0

MVVM은 WPF 용으로 특별히 설계되었습니다. 윈도우즈 폼에서 얼마나 잘 작동하는지 모르겠습니다. 재 작업 제한에 동의하지만 WPF와 Winforms가 너무 다르기 때문에 viewmodel에 ICommmand가 없어도 쉽게 전환 할 수 있을지 모르겠다. – jle

+0

Ok, 정말 내 ViewModels 및 모델을 사용하여 문제가 보이지 않습니다. ICommand 구현을 제외하고 Windows Forms 응용 프로그램에서. 예를 들어, Windows Forms 컨트롤은 ViewModel에 대한 참조를 포함하고 OnPropertyChanged 이벤트를 후크하여 필요에 따라 자체를 무효화 할 수 있습니다. 페인트 메세지는, ViewModel의 현재 상태에 의해 요구 된대로 간단하게 페인트합니다. 나는 원래 질문 게시 아이디어에 내 의견을 사용하려고합니다. 다른 방법으로 생각할 수 있습니까? –

1

내 생각에 MVVM은 WPF, Silverlight에 자연스럽게 들어 있기 때문에 매우 인기가 있습니다. XAML의 데이터 바인딩 개념을 사용하면 Views & ViewModels가 DataContext 인 단일 속성을 사용하여 연결될 수 있습니다. 더 이상 로직이 컨트롤에 연결되지 않으므로 테스트 가능성, 디자인 코드 분리 및 유지 관리 기능이 향상됩니다. 다른 곳에서도 MVVM 패턴을 구현할 수 있지만 WPF 및 Silverlight에서는 데이터 및 명령 바인딩 지원으로 인해 쉽게 적합합니다. 나는 그것을 어딘가 읽었습니다. 패턴을 종교적으로 받아들이지 마십시오. 그것들은 당신이 그것을 따르는 동안 더 많은 문제를주는 것보다 당신의 삶을 단순하게 만들어졌습니다. Winforms의 경우 더 나은 패턴이 있다고 생각합니다. 비즈니스 로직을 재사용하는 데 주력하고 있다면 ViewModel 밖으로 이동하여 serviceproviders 나 serviceagent와 같은 클래스를 분리하고 Winforms와 WPF 앱간에 공유하십시오.

+0

Moble Joseph에게 감사드립니다. 그런 식으로 할 수는 있지만 제게는 모든 비즈니스 로직을 비즈니스 규칙에 적용 할 정보에 직접 액세스하지 않고 별도의 클래스로 추상화하려는 불편 함이 더 많습니다. . 모든 데이터는 클래스에 전달되어야합니다. 난 아직도 내 최고의 옵션은 명령에 대한 WPF에 특정 자손 ViewModels를 만드는 것입니다, 당신은 제대로 이해 못해? –

+0

그래서 지금 당신은 그 명령 안에 비즈니스 논리를합니까? 일부 데이터 전송 객체를 사용하여 비즈니스 규칙을 별도의 클래스로 분리하지 않습니까? –

+0

논리는 실제로 복잡하지 않다. 프로그램 dosnt는 데이터베이스를 백엔드로 사용한다. 모델에 저장되어있는 객체에 대한 상태 정보 만 있으면 ViewModels은 이벤트를 통해 변경 사항보기를 알린다. 이 경우 PropertyChanged 이벤트). 그래서 예, 프로그램의 모든 논리는 ViewModel 내부에 있습니다. 기본 MVVM 만 모델, ViewModel 및 기타 추가보기는 MVVM 위에 있습니다. 혹시 당신의 Scrabble Board Solver에 대해 궁금 할 경우. 그러나 해결사 코드가 별도의 클래스로 추상화되었습니다 –

1

이것은 .NET 4.5

비교에서 변경
+0

Microsoft의 직원이 내 의견을 읽고이를 이전하기로 결정했는지는 모르겠지만 이제는 시스템의 .NET 기본 프레임 워크 인 hurray에 포함되어 있습니다. ! –

관련 문제