2009-06-21 24 views
6

ViewModel tarafından gösterilen bir RelayCommand MVVM fikrini beğeniyorum. Başka kullanıcı girişi olmadan yapılabilecek işlemler için bu hoş ve zarif. Basit. Test edilebilir. Bununla birlikte, tüm işlemler UI'sız değildir. Bazıları onay gerektiriyor ("Silmek istediğinizden emin misiniz?"). Diğerleri henüz daha fazla bilgiye ihtiyaç duyar. Bir dosyayı açmak, bir Tam Açılan içe aktarma sihirbazı aracılığıyla bir Dosya Aç iletişim kutusundan herhangi bir şey içerebilir.MVVM ve daha fazla GUI gösterecek komutlar

Bir MVVM uygulamasında, kullanıcı girişi gerektiren komutları yazmak için en iyi yol nedir? Bir şekilde bağımlılık enjeksiyonu ile bunu çözmek için yerleşik bir model var mı? Kod arkasındaki bir KeyDown işleyicisini yazmalı ve bunu olayı açıkça yürütmeli miyim? RoutedUICommand'a geri dönmeli ve View'ımdaki "sonraki GUI" kodunu koymalı mıyım? Yoksa tamamen özlediğim bir şey var mı?

cevap

4

Genellikle bir çeşit soyut IShowThe Arayüz nesnesini enjekte etmek için Bağımlılık Enjeksiyonunu kullanırım ve daha sonra Komuta içinden gelen soyutlama yöntemlerini çağırır. Bu yöntemler daha sonra size eylemin devam edip etmeyeceğini ve kullanıcının hangi girdiyi verdiğini belirlemeniz için gereken cevapları vermelidir.

Son zamanlarda bunu blog post with a bit of a different topic numaralı telefondan örnek olarak kullandım.

1

Bu tür şeyler (onay iletişim kutuları, dosya açma iletişim kutuları vb.) Genellikle uygulamalar arasında paylaşılır. Bu yüzden tercihim onları ViewModel'e koymadı.

ViewModel uygulamaya özgüdür ve ViewModelBase'i süresiz olarak genişletmek iyi bir fikir değildir. Bunun yerine, Görünümü genişletmek için yeniden kullanılabilir davranışlar oluşturun. Expression Blend Gallery

DÜZENLEME de quete birkaç davranış örnekleri vardır:

Davranışlar özelliklere sahip olabilir ve sadece davranış özelliklerini belirtmek için değil, aynı zamanda bazı geribildirim almak için bu özellikleri kullanabilirsiniz:

<Button Content="Open Document"> 
    <i:Interaction.Behaviors> 
     <local:FileOpenBehavior 
      FileNameTarget="{Binding ElementName=tbDocName}"/> 
    </i:Interaction.Behaviors> 
</Button> 

Yukarıdaki örnekte, tbDocName gizlenebilir - veya ModelView'ünüzün bir özelliğine bağlayabilirsiniz.

+0

"Açık bir iletişim kutusu göster" kısmı yeniden kullanılabilir; ama sonra o dosyayla bir şeyler yapman gerekiyor, ve bu uygulamaya özgü olacak, bu yüzden nasıl çalıştığını göremiyorum. Bunu davranışlarla nasıl yapacağınıza dair bir örnek verebilir misiniz? –

+0

@ joe-beyaz Yakalanacak ve ViewModel'e aktarılacak olan UI yığınına yönlendirilmiş bir ileti gönderin ... Veya bir ViewModel'de bir özelliği bağlarsanız, özellik değiştiğinde dosyanın atanacağını bilirsiniz. –