2013-03-13 21 views
8

Henüz bir açıklama bulamadığım ilginç bir soruna rastladım ...ViewModel üyelerinin görünürlüğü ne olmalıdır?

Aşağıdaki çok basit MVVM WPF uygulaması verildiğinde, liste açılan pencereye yalnızca görünürlüğü bağlıysa ViewModel public olarak ayarlandı mı?

internal için TestList görünürlüğünü değiştirmek, derleme zamanında bir hata veya uyarı ortaya çıkarmaz, ancak çalışma zamanında açılır kutuyu boş bırakır.

the official documentation'dan alıntı: internal türleri veya üyelerine yalnızca aynı derlemedeki dosyalar içinde erişilebilir.

Ve bu sorun, Görünüm ve ViewModel'in aynı derlemede tanımlanmış olmasına rağmen gerçekleşiyor. İşte

kodu nasıl gözüktüğü:

Modeli:

class TestModel 
{ 
    internal List<string> Musketeers { get; private set; } 

    public TestModel() 
    { 
     Musketeers = new List<string> { "Athos", "Porthos", "Aramis" }; 
    } 
} 

Görünüm:

<Window x:Class="TestWpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ComboBox Width="250" Height="25" ItemsSource="{Binding TestList}" /> 
    </Grid> 
</Window> 

ViewModel:

erişimli
class TestViewModel : INotifyPropertyChanged 
{ 
    TestModel myModel = new TestModel(); 

    public List<string> TestList 
    { 
     get 
     { 
      return myModel.Musketeers; 
     } 
    } 

    // INotifyPropertyChanged members are below ... 
} 
+0

_Bu görünüm ve ViewModel aynı mecliste değil mi? _ Bunu cevaplayamıyorum. Onları tanımladığınız yer neresidir? –

+0

@ChrisDunaway Oops, haklısınız! Şimdi benim ifademi düzelttim ... –

cevap

7

ViewModelView görebilir, ama gerçekten bağlama işi yapan Binding sınıfına, görünür değildir.

{Binding TestList} sizin ViewModel sınıfın internal üyeler hakkında hiçbir bilgiye sahip Binding sınıf örneğine, dönüşür.

+0

Bunu yapmayi tavsiye etmiydim, ama simdi de 'internal' kullanilmasina ragmen, 'PresentationCore' 'bir' InternalsVisibleTo 'olsaydi derhal kullanabileceginizi merak ediyorum. montaj ... – JerKimball

+0

Belki de bu şekilde yapılabilir, ama böyle bir şey yapmanın amacı nedir? – MarcinJuraszek

+0

Kesinlikle hiçbir neden yok :) - Ben sadece herhangi bir durumda * ne * olduğunu bilmek istiyorum. – JerKimball

6

Bunun nedeni, Veri Bağlama işleminin yansımayı kullanması ve bu da öğelerin görünürlüğünü artırmasıdır. Veri bağlama, derlemenizin dışında uygulandığından - WPF kitaplıklarının içinde - halka açık olmayan üyeleri göremez.

Varolan üyeye bağlanmak, bir çalışma zamanı hatası vermeyecek, ancak eksik üye hakkındaki ayrıntıları içeren bir mesajla hata ayıklama çıktısı vermeyecektir.

+0

Cevabınız için teşekkürler! Çok kötü, birkaç cevabı kabul etmek mümkün değil ... –

İlgili konular