2016-03-31 27 views
2

aracılığıyla kullanıcı denetiminin VM'sine geçirin Bir MVVM Light WPF uygulamasında Entity Framework 6 kullanıyorum. Uygulamanın DbContext değerini, kullanıcı denetiminin MainWindow.xaml modelinin görünüm modeline iletmek istiyorum.DB içeriğini, XAML

kullanıcı denetiminin görünüm modeli SearchEmployeeViewModel.cs olup aşağıdaki kurucu sahiptir:

public SearchEmployeeViewModel(MyEntities context) 
{ 
    Context = context; 

    // Other code... 
}  

MainWindow.xaml bu kullanarak kullanıcı kontrolü beyan ve bu benim girişimi gidebiliriz kadarıyla var:

<usercontrol:SearchEmployeeControl> 
    <ObjectDataProvider ObjectType="{x:Type data:MyEntities}"> 
     <ObjectDataProvider.ConstructorParameters> 
      <data:MyEntities > 

      </data:MyEntities> 
     </ObjectDataProvider.ConstructorParameters> 
    </ObjectDataProvider> 
</usercontrol:SearchEmployeeControl> 

Uygulamanın en DbContextMainViewModel.cs yapıcı bu şekilde başlatılır:

_context = new MyEntities(); 

Bu EF DbContext'u SearchEmployeeViewModel.cs yapıcısına MainWindow.xaml aracılığıyla nasıl iletirim? Ben buna benzer bir şey yapmaya çalışıyor, ancak tüm veriler bağlam nesnesi geçiyorum: Where to create parametrized ViewModel?

Güncelleme: kullanıcı denetimi için EF DBContext geçmesine çalışıyorum.

+1

Bence kurucunuzdaki diğer kodunuz başlatılan bağlamı kullanmıyorsa, bu sorunun özellik enjeksiyonu cevabı sizin sorunuz için de geçerli olacaktır. –

+0

Teşekkürler, @GordonAllocman. Bu cevabı bile anlamadım! – Alex

+0

Sözdizimi bunun için ne olurdu, @GordonAllocman? MainWindow.xaml içinde, bu kullanıcı denetimi bildiriminin içinde var: ''. 'Bağlam' özelliğini herhangi bir şeye bağlamama izin vermez. Peki veri nesnesine nasıl aktarırım? – Alex

cevap

7

Bu MVVM ile etiketlendiğinizi test ettim, bu yanıt MVVM'yi temel alacaktır.

Görünüm hiç bir nesne oluşturmamalı veya değerler atamaya çalışmamalı ... yalnızca kullanıcıların etkileşimde bulunmak için kullanabilecekleri ViewModel/Modellerin kullanıcı dostu bir yansıması olması gerekir.

Şimdi ne var gibi görünmektedir:

  • AppStartup EF DBContext oluşturur ve View.DataContext atamak
  • Görünüm ViewModel oluşturur ve bunu EF DBContext
geçmesine çalışır

Bu yanlıştır; çünkü Görünüm, nesne oluşturma veya bunun gibi değerleri atamadan sorumlu olmamalıdır. Eğer MVVM için ne istersin

  • ViewModel ve EF DBContext
  • Setleri
  • Görünüm oluşturur ViewModel DBContext oluşturur AppStartup

    • ve Görünüm ViewModel atar.DataContext
  • Görünüm kullanıcıya ViewModel görüntüler ve onları

Yani ne olmalıdır etkileşimde böyle bir şeydir sağlar:

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    var app = new MainWindow(); 
    var dbContext = new MyEntities(); 
    var context = new MyViewModel(dbContext); 

    app.DataContext = context; 
    app.Show(); 
} 

AppStartup herhangi bir uygulama sorumludur EF DataContext veya ViewModels oluşturma gibi başlatma. View'den

, sen

<DataTemplate DataType="{x:Type local:SearchEmployeeViewModel}"> 
    <userControl:SearchEmployeeControl /> 
</DataTemplate> 

gibi bir şey yazabilirsiniz ve bu SearchEmployeeControl kullanarak çizmek,

Herzaman sen VisualTree tip SearchEmployeeViewModel bir nesne karşılaşmak WPF anlatmak ve ayarlayacaktır Bu denetimin DataContext numarası SearchEmployeeViewModel. Daha fazla bilgi edinmek ilgileniyorsanız

<ContentControl Content="{Binding SearchEmployeeViewModel}" /> 

<TabControl Content="{Binding TabViewModels}" /> 

Ben de bir Simple MVVM Example on my blog varsa, ya ben çok tavsiye ederim:

Tipik ViewModels böyle, Content veya ItemsSource özellik aracılığıyla kullanıcı arayüzüne eklenen WPF'de çok yeniyseniz ve hala DataContext'in ne olduğunu veya nasıl çalıştığını anlayamıyorsanız, What is this "DataContext" you speak of? değerini okuyun. Eğer söz konusu olduğu gibi sizin Görünüm ViewModel değerini atamak zorunda istiyorsa


, seçenekleriniz ya

  • Görünüm arkasında Kanunu aracılığıyla mülk atama mı dedim That
  • Bir DependencyProperty öğesinin ViewModel.Context değerini değiştirin ve OneWayToSource bağlama modunu kullanarak bağlanın; bu, bağlanmanın yalnızca Görünüm'den ViewModel'e değerler aktarılarak çalışacağı anlamına gelir.

Bunlardan birini önermiyorum ve bunu MVVM'de doğru şekilde yapmak için yeniden tasarlamayı tercih ediyorum, ancak bir tane seçmeye zorlanırsam, kodu arkada kullanmayı seçerdim. Zaten bu noktada bir grup kuralı kırıyorsunuz, bu yüzden neden bir tane daha değil :)

+0

Teşekkürler, @Rachel. WPF odasında sohbet etmeyi düşünüyor musunuz? https://chat.stackoverflow.com/rooms/18165/wpf – Alex

+2

@Alex Ben isterdim, ama bu benim ofisimden engellenir, bu yüzden başka bir gün olmalıydı. Herhangi bir sorunuz varsa yarın bana ping yapmaktan çekinmeyin ya da sadece yorumlarda paylaşın :) – Rachel

+2

@Rachel Yeni bir ofise ihtiyacınız var gibi geliyor.

0

Böyle bir şey istiyorum:

<usercontrol:SearchEmployeeControl> 
    <usercontrol:SearchEmployeeControl.DataContext> 
     <viewModel:SearchEmployeeViewModel> 
      <ViewModel:SearchEmployeeViewModel Context={Binding RelativeSource={RelativeSource AncestorType={x:Type Window}} /> 
     </viewModel:SearchEmployeeViewModel> 
    </usercontrol:SearchEmployeeControl.DataContext> 
</usercontrol:SearchEmployeeControl> 

Önemli şeyler AncestorType={x:Type Window} görüşünüz ne olursa olsun olmalı, dikkat etmek (yani Pencere, Sayfa, vb ..).

Ayrıca, görünüm modelinizin bildiriminizin tek bir etikette olması gerekir. Bir açılış ve kapanış etiketiniz varsa, bir Setter kullanmanız gerektiğini düşünüyorum, ancak bu

+0

Bu durumda, 'Bağlam' 'SearchEmployeeViewModel 'e başvurmaktadır.Bağlam özelliği olmayan bir bağımlılık özelliği ve bu nedenle veri bağlama kabul etmez ve bu çalışmaz. OP'nin bu özelliği, WPF/MVVM – Rachel

+0

kullanırken genellikle tavsiye edilmeyen XAML aracılığıyla başlatmayı amaçladığını düşünüyorum. Bu muhtemelen iyi bir mvvm uygulaması olmadığını kabul etmekteyken, İçeriğin bir özellik olup olmadığını anlayamayız. sadece bize verdiği kod. Bunu kendi kodumun bazılarında bir viewmodel ile denedim ve bu gibi özellikleri ayarlayabildim. Benim cevabım tam olarak hangi OP DataContext viewmodel –

+0

göndermek olduğunu sordu EF DbContext alt kullanıcı kontrolüne geçmeye çalışıyorum. Yukarıdaki güncellemeye bakın. Teşekkürler. – Alex