MVVM'de, ViewModel veya View yeni görünümler oluşturmaktan sorumlu olmalı mı?


11

WPF uygulamamda yeni bir görünüm oluşturmak istiyorum. Bunu nerede yapmalıyım - ViewModel veya Model'de ?

Uygulama tek bir "gönder" düğmesi ile (şimdilik çok basit) tek pencereli form benzeri bir araçtır. Onay kutularından birinin seçilmesi durumunda, kullanıcıya bazı ek ayrıntılar istemek için aynı ViewModel'i kullanan yeni bir pencere açılmalıdır. Bu sorunun amaçları için, gösterilen / gizli panel gibi başka yaklaşımları düşünmeden sadece yeni pencere yaklaşımını ele alalım.

İdeal olarak, Görünüm'de herhangi bir kod olmamalıdır. Ayrıca, Görünüm'ün içinde herhangi bir mantık olmadığı için, VM'nin başlangıçta yeni görünüm oluşturmanın gerekip gerekmediğini ve - olduğunda - bu sorumluluğu Görünüm'e geri döndürerek kod şişmesine neden olması gerekir.

Öte yandan, ViewModel'de yeni bir görünüm oluşturmak ViewModel'in View hakkında hiçbir şey bilmemesi ilkesini ihlal eder.

Peki, View veya ViewModel'de yeni görünümler oluşturmak daha mı iyi?


1
Sorunuzu gerçekten anlamıyorum. "View in veya ViewModel" ne anlama geliyor? ViewModels görünüm oluşturmaz ve görünümler kesinlikle kendilerini oluşturmaz.
Robert Harvey

1
Yani, bu katmanlardan hangisinin yeni görünümler oluşturmaktan sorumlu olması gerektiği - eylem gerçekleştiğinde bunun bir yerden gelmesi gerektiğini gösteren sinyal. Modeli bu sorudan tamamen çıkardım, çünkü ön uç hakkında hiçbir şey bilmemelidir.
Mac70

Belki sorunuzu doğru anlamıyorum, her ikisi de sizin görüşünüze müdahale etmemelidir. ViewModel'inizde yeni bir görünüm oluşturmak istiyorsanız, xaml içindeki kareleri, geçerli viewModel'inize bir bağlama ile değiştirmek için xaml'de kareler kullanmamanızın bir nedeni var mı?
Siobhan

Yanıtlar:


8

Her IViewFactoryiki kısıtlamaya saygı göstermek için bağımlılık enjeksiyonu ve görünüm modeline bir enjekte kullanıyorum .

A ProductViewModel(örneğin) kendisi ile this.viewFactory.Show("Details", this)açılmaya çağırır . Ayrıca, başka bir görünüm modeline dayalı bir görünüm açabilir .ProductDetailsViewProductViewModelthis.viewFactory.Show<ClientViewModel>()

Uygulama (aslında WinForms için birkaç tane var, basit Wpf Windows, sekmeli bir Wpf kabuğu, ...) bir kurala dayanmaktadır StructureMap. Görünümler görünüm modellerini bir IView<ProductViewModel>arabirim aracılığıyla belirler .

Dolayısıyla görünüm modeli, rolü (varsayılan görünüm, ayrıntı görünümü, ...) dışında görünüm hakkında hiçbir şey bilmez ve görünüm başka bir görünüm oluşturmak için kod içermez. Ayrıca, görünüm modelleri herhangi bir Wpf montajına başvurmayan ayrı bir montajdadır.


7

Teorik cevap

Eğer varsa, ViewModelkozmetik efektleri olan eylemler (örneğin fareyle üzerine gelindiğinde bir öğeyi vurgulayın) işin, View"gerçek" efektleri (örneğin yeni bir pencerenin yumurtlanması) olan eylemlerin işidir ViewModel.

Bu nedenle, yeni bir pencere oluşturmak için bir iştir ViewModel. Ancak, ne Görünüm ne de ViewModeltam olarak nasıl bir Pencere oluşturulacağını bilmemelidir, bu onların sorumluluklarının bir parçası değildir ve farklı bir sınıfa aittir.

Yeni bir pencere oluşturmanın bir iş olduğunu iddia edebilirsiniz View. Kabul etmeme rağmen, böyle bir tartışmada çok az değer var, çünkü pratikte bu kodu içine yerleştirirseniz dünyanın sonu değildir Viewve ayrıca ViewModeldaha sonraki bir noktaya taşımak için çok fazla iş değildir . Önemli olan, yeni bir pencere oluşturma mantığının bağımsız bir sınıfta, genellikle bir çeşit WindowFactory'de yer almasıdır. MVVM, MVP, MVC vb. Nokta, az ve iyi tanımlanmış sorumluluklara sahip sınıflara sahip olmanızdır. Eğer ek sorumluluklar katmayan yüzden View, ViewModelya Modeleğer gerek yoktur.

Hiçbir koşulda aittir Pencere oluşturulmasını yapar Model, çünkü Modelbir GUI gibi bir şey olduğunu bile farkında değildir.

Pratik cevap

Bu, tek bir "gönder" düğmesi "olan" tek pencereli bir form benzeri araç "ile ilgilidir . İşte ilgili cevabım için utanmaz bir fiş: Neden MVVM kullanıyorsunuz?

Bu cevabın söylediklerini özetlemek gerekirse: Basit tutun. Oh, ve tek tuşlu pencereniz daha karmaşık hale geldiğinde uygulamak için yukarıdaki teorik cevabı aklınızda bulundurun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.