MVVM 템플릿의 좋은 예
저는 현재 Microsoft MVVM 템플릿을 사용하고 있으며 자세한 예제가 부족하여 답답합니다.포함된 ContactBook 예제에서는 명령 처리가 거의 표시되지 않으며, 개념은 비슷하지만 약간 다른 접근 방식을 사용하고 복잡성이 여전히 부족한 MSDN Magazine 기사의 다른 예만 확인할 수 있습니다.최소한 기본적인 CRUD 작업과 대화/콘텐츠 전환을 보여주는 괜찮은 MVVM 사례가 있습니까?
모두의 제안이 정말 유용했고 좋은 자료 목록을 작성하겠습니다.
프레임워크/템플릿
유용한 기사
- 모델-뷰-뷰 모델 설계 패턴이 있는 WPF 애플리케이션
- 의 데이터 유효성 검사.NET 3.5
- View 모델을 사용하여 의미 있는 유효성 검사 오류 메시지 제공
- 작업 기반 View 모델 및 모델 검증
- 대화상자
- MVVM의 명령 바인딩
- WPF를 위한 MVC 이상의 기능
- MVVM + 중재자 예제 응용 프로그램
스크린캐스트
추가 라이브러리
- WPF Dependers의 향상된 Mediator Pattern 구현(보다 복잡한 탐색 기능이 있는 응용 프로그램에 적극 권장)
- MVVM Light Toolkit Messenger
안타깝게도 모든 것을 수행하는 훌륭한 MVVM 예제 앱은 없으며, 작업에 대한 다양한 접근 방식이 있습니다.먼저, 애플리케이션 프레임워크 중 하나에 익숙해지고 싶을 수도 있습니다(프리즘은 적절한 선택입니다). 의존성 주입, 명령, 이벤트 집계 등 사용자에게 적합한 다양한 패턴을 쉽게 시도할 수 있는 편리한 도구를 제공하기 때문입니다.
프즘해제리::
http://www.codeplex.com/://www.codeplex.com/CompositeWPF
그것은 많은 작은 예시와 방법과 함께 꽤 괜찮은 예시 앱(주식 거래자)을 포함하고 있습니다.최소한 MVVM을 실제로 작동시키기 위해 사용하는 몇 가지 일반적인 하위 패턴을 잘 보여줍니다.그들은 CRUD와 대화상자 모두에 대한 예를 가지고 있다고 생각합니다.
프리즘이 모든 프로젝트에 꼭 필요한 것은 아니지만, 친숙해지기에 좋은 것입니다.
CRUD: 이 부분은 매우 쉽습니다. WPF 양방향 바인딩을 사용하면 대부분의 데이터를 쉽게 편집할 수 있습니다.진짜 비결은 UI를 쉽게 설정할 수 있는 모델을 제공하는 것입니다.최소한 View Model(또는 비즈니스 개체)이 구현되었는지 확인해야 합니다.INotifyPropertyChanged
컨트롤에 바인딩할 , 딩을인지고 UI 지만있수할바딩다바, 기를있습니수도원할구현하원하인을 구현할 .IDataErrorInfo
것은 .일반적으로 ORM 솔루션을 사용하는 경우 CRUD를 쉽게 설정할 수 있습니다.
이 문서에서는 간단한 크루드 작업을 시연합니다. http://dotnetslackers.com/articles/wpf/WPFDataBindingWithLINQ.aspx
기반으로 이 합니다. 가 "LinkqToSql", "Link"를 구현한다는 입니다. 중요한 것은 비즈니스 객체가 구현되어야 한다는 것입니다.INotifyPropertyChanged
(LinqToSql에서 생성한 클래스).MVVM이 그 예의 요점은 아니지만, 이 경우에는 중요하지 않다고 생각합니다.
에서는 데이터 에 대해 합니다.
http://blogs.msdn.com/wpfsdk/archive/2007/10/02/.aspxhttp ://blogs.msdn.com/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx
, 솔루션은 ORM을 한 클래스를 생성합니다.IDataErrorInfo
일반적으로 사용자 지정 유효성 검사 규칙을 쉽게 추가할 수 있는 메커니즘을 제공합니다.
대부분의 경우 일부 ORM에 의해 생성된 개체(모델)를 View Model(보기 모델)로 래핑하여 이를 저장하고 저장/삭제 명령을 수행할 수 있습니다. 그러면 UI를 모델의 속성에 직접 바인딩할 수 있습니다.
).Item
ORM 서생클래처모럼유델지다니합을스성된에)▁that다니,유▁holds.
<StackPanel>
<StackPanel DataContext=Item>
<TextBox Text="{Binding FirstName, Mode=TwoWay, ValidatesOnDataErrors=True}" />
<TextBox Text="{Binding LastName, Mode=TwoWay, ValidatesOnDataErrors=True}" />
</StackPanel>
<Button Command="{Binding SaveCommand}" />
<Button Command="{Binding CancelCommand}" />
</StackPanel>
대화 상자:대화상자와 MVVM은 조금 까다롭습니다.대화상자와 함께 중재자 접근 방식을 사용하는 것을 선호합니다. StackOverflow 질문에서 이에 대한 자세한 내용을 읽을 수 있습니다.
WPF MVVM 대화 상자 예제
일반적인 MVVM이 아닌 일반적인 접근 방식은 다음과 같이 요약할 수 있습니다.
커밋 및 취소 작업에 대한 명령을 표시하는 대화 상자 ViewModel의 기본 클래스, 대화 상자를 닫을 준비가 되었음을 알리는 이벤트 및 모든 대화 상자에 필요한 다른 모든 것을 표시합니다.
대화상자의 일반 보기 - 창 또는 사용자 정의 "모달" 오버레이 유형 컨트롤일 수 있습니다.핵심은 뷰 모델을 덤프하는 컨텐츠 프레젠터이며 창을 닫기 위한 배선을 처리합니다. 예를 들어, 데이터 컨텍스트 변경 시 새 View 모델이 기본 클래스에서 상속되는지 여부를 확인하고, 상속된 경우 관련 닫기 이벤트에 가입할 수 있습니다(처리기가 대화 상자 결과를 할당함).대체 범용 닫기 기능(예: X 버튼)을 제공하는 경우에는 View Model에서도 관련 닫기 명령을 실행해야 합니다.
View 모델에 대한 데이터 템플릿을 제공해야 하는 곳에서는 특히 각 대화 상자에 대한 보기가 별도의 컨트롤에 캡슐화되어 있으므로 매우 단순할 수 있습니다.View Model의 기본 데이터 템플릿은 다음과 같습니다.
<DataTemplate DataType="{x:Type vmodels:AddressEditViewModel}">
<views:AddressEditView DataContext="{Binding}" />
</DataTemplate>
대화 상자 보기는 이러한 액세스 권한이 있어야 합니다. 그렇지 않으면 공유 대화 상자 UI를 제외하고 View Model을 표시하는 방법을 알 수 없기 때문입니다. 내용은 기본적으로 다음과 같습니다.
<ContentControl Content="{Binding}" />
암시적 데이터 템플릿은 뷰를 모델에 매핑하지만 누가 실행합니까?
이것은 그다지 mvm이 아닌 부분입니다.한 가지 방법은 글로벌 이벤트를 사용하는 것입니다.제가 생각하기에 더 나은 방법은 의존성 주입을 통해 제공되는 이벤트 애그리게이터 유형 설정을 사용하는 것입니다. 이렇게 하면 이벤트가 전체 앱이 아닌 컨테이너에 대해 전역적으로 적용됩니다.프리즘은 컨테이너 의미론과 의존성 주입을 위해 유니티 프레임워크를 사용하며, 전반적으로 유니티를 상당히 좋아합니다.
일반적으로 루트 창은 이 이벤트를 구독하는 것이 좋습니다. 이 창은 대화 상자를 열고 상승된 이벤트와 함께 전달되는 ViewModel로 데이터 컨텍스트를 설정할 수 있습니다.
이러한 방식으로 설정하면 ViewModel은 애플리케이션에 대화상자를 열고 UI에 대해 아무것도 알지 못한 채 사용자 작업에 응답하도록 요청할 수 있으므로 대부분의 경우 MVVMness가 완료된 상태로 유지됩니다.
그러나 UI가 대화 상자를 높여야 하는 경우가 있으므로 상황이 좀 더 까다로울 수 있습니다.예를 들어, 대화 상자 위치가 대화 상자를 여는 단추의 위치에 따라 달라지는 경우를 고려합니다.이 경우 대화 상자 열기를 요청할 때 UI 관련 정보가 있어야 합니다.일반적으로 ViewModel과 관련 UI 정보를 포함하는 별도의 클래스를 만듭니다.불행하게도 거기서 어떤 커플링은 피할 수 없을 것 같습니다.
요소 위치 데이터가 필요한 대화 상자를 발생시키는 버튼 핸들러의 유사 코드:
ButtonClickHandler(sender, args){
var vm = DataContext as ISomeDialogProvider; // check for null
var ui_vm = new ViewModelContainer();
// assign margin, width, or anything else that your custom dialog might require
...
ui_vm.ViewModel = vm.SomeDialogViewModel; // or .GetSomeDialogViewModel()
// raise the dialog show event
}
상자 데이터에 대자뷰가위데바포고뷰되내전모로 전달합니다.ContentControl
View Model 자체는 여전히 UI에 대해 아무것도 알지 못합니다.
일반적으로 저는 다음을 사용하지 않습니다.DialogResult
의 반환 .ShowDialog()
대화 상자가 닫힐 때까지 스레드를 차단합니다.비표준 모달 대화 상자가 항상 그렇게 작동하는 것은 아니며 복합 환경에서는 이벤트 핸들러가 이러한 방식으로 차단하는 것을 원하지 않는 경우가 많습니다.ViewModel 작성자가 관련 이벤트를 구독하거나 커밋/취소 방법 등을 설정할 수 있으므로 이 UI 메커니즘에 의존할 필요가 없습니다.
따라서 이러한 흐름 대신:
// in code behind
var result = somedialog.ShowDialog();
if (result == ...
사용자:
// in view model
var vm = new SomeDialogViewModel(); // child view model
vm.CommitAction = delegate { this.DoSomething(vm); } // what happens on commit
vm.CancelAction = delegate { this.DoNothing(vm); } // what happens on cancel/close (optional)
// raise dialog request event on the container
대부분의 대화 상자가 비차단 의사 모드 제어이기 때문에 이러한 방식을 선호하며 이러한 방식으로 수행하는 것이 작업하는 것보다 더 간단합니다.유닛 테스트도 쉽습니다.
Jason Dolinger는 MVVM의 좋은 스크린캐스트를 만들었습니다.에고르가 언급한 것처럼 좋은 예는 없습니다.그들은 모두 끝났습니다.대부분은 MVVM의 좋은 예이지만 복잡한 문제가 발생할 경우에는 그렇지 않습니다.모든 사람은 각자의 방식이 있습니다.Laurent Bugnion은 뷰 모델 간에 의사소통하는 좋은 방법도 가지고 있습니다.http://blog.galasoft.ch/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx Cinch도 좋은 예입니다.Paul Stovel은 그의 마젤란 프레임워크에 대해 많은 것을 설명하는 좋은 게시물을 가지고 있습니다.
캘리번 봤어요?Contact Manager 샘플에는 좋은 것들이 많이 들어 있습니다.또한 일반적인 WPF 샘플은 명령에 대한 좋은 개요를 제공합니다.문서는 상당히 양호하고 포럼은 활성화되어 있습니다.추천!
이게 도움이 됐어요코드도 있습니다.
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
코드 프로젝트에 대한 간단한 MVVM 예제를 처음부터 작성했습니다. 여기에는 MVVM WPF 링크가 단계별로 나와 있습니다.간단한 3계층 아키텍처에서 시작하여 PRISM과 같은 프레임워크를 사용할 수 있습니다.
Cinch 프레임워크의 샘플 프로젝트는 기본 CRUD와 탐색 도구를 보여줍니다.MVVM 사용의 좋은 예이며, MVVM의 사용과 동기를 설명하는 여러 부분의 기사가 포함되어 있습니다.
저도 당신의 좌절감에 공감했습니다.저는 신청서를 작성하고 있는데 다음 세 가지 요구 사항이 있었습니다.
- 확장 가능
- MVVM을 사용하는 WPF
- GPL 호환 예제
제가 발견한 것은 단편적인 것들 뿐이었기 때문에, 저는 제가 할 수 있는 최선을 다해 쓰기 시작했습니다.좀 더 연구해 본 후에, 저는 (여러분과 같은) 다른 사람들이 레퍼런스 애플리케이션을 사용할 수 있다는 것을 깨달았습니다. 그래서 저는 일반적인 것들을 WPF/MVVM 애플리케이션 프레임워크로 리팩터링하여 LGPL로 출시했습니다. 저는 그것을 SoapBox Core라고 이름 지었습니다.다운로드 페이지로 이동하면 작은 데모 응용 프로그램과 함께 제공되며 해당 데모 응용 프로그램의 소스 코드도 다운로드할 수 있습니다.도움이 되길 바랍니다.또한 더 많은 정보가 필요하시면 scott {at} soapboxautomation.com 으로 이메일을 보내주시기 바랍니다.
편집: 작동 방식을 설명하는 코드 프로젝트 기사도 게시했습니다.
여기에 제가 설계한 MVVM 아키텍처를 사용하는 WPF(Inventory Management App) 애플리케이션의 링크를 추가합니다.
그것의 UI는 정말 멋집니다.https://github.com/shivam01990/InventoryManagement
저도 그 일을 손에 넣기 전까지는 그 좌절감을 함께 했습니다.저는 IncEditor를 시작했습니다.
IncEditor(http://inceditor.codeplex.com )는 개발자들에게 WPF, MVVM 및 MEF를 소개하는 편집자입니다.저는 그것을 시작했고 '테마' 지원과 같은 몇 가지 기능을 얻을 수 있었습니다.저는 WPF나 MVVM, MEF에 대한 전문가가 아니기 때문에 많은 기능을 넣을 수 없습니다.저 같은 미치광이들이 더 잘 이해할 수 있도록 여러분들께 진심으로 부탁드립니다.
언급URL : https://stackoverflow.com/questions/1662309/good-examples-of-mvvm-template
'programing' 카테고리의 다른 글
Windows에서 SSH에서 Vagrant 박스로? (0) | 2023.04.27 |
---|---|
UICollectionView 셀을 수평으로 중앙에 배치하는 방법은 무엇입니까? (0) | 2023.04.27 |
등호(=) 대맘에 들다 (0) | 2023.04.27 |
zure의 윈도우 서비스와 동등한 것은 무엇입니까? (0) | 2023.04.27 |
Git의 .classpath 및 .project 무시 (0) | 2023.04.27 |