2013-03-13 37 views
8

Tôi đã gặp một vấn đề thú vị mà tôi chưa tìm thấy lời giải thích nào ...Chế độ hiển thị thành viên của ViewModel là gì?

Với ứng dụng MVVM WPF rất đơn giản bên dưới, tại sao danh sách này chỉ được kết hợp với hộp tổ hợp ViewModel được đặt thành public?

Thay đổi hiển thị TestList thành internal không gây ra lỗi hoặc cảnh báo lúc biên dịch nhưng để trống hộp tổ hợp tại thời gian chạy.

Trích dẫn the official documentation: internal loại hoặc thành viên chỉ có thể truy cập trong các tệp trong cùng một cụm.

Và sự cố này xảy ra mặc dù thực tế là Chế độ xem và ViewModel được xác định trong cùng một hội đồng.

Sau đây là cách mã trông giống như:

mẫu:

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

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

Xem:

<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:

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

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

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

_Không phải là Chế độ xem và Chế độ xem trong cùng một cụm? _ Tôi không thể trả lời câu hỏi đó. Bạn đã xác định chúng ở đâu? –

+0

@ChrisDunaway Rất tiếc, bạn đã đúng! Tôi đã cố định từ ngữ của mình bây giờ ... –

Trả lời

7

ViewModel với quyền truy cập internal hiển thị cho View, nhưng không hiển thị cho lớp học Binding, điều này thực sự làm cho tác phẩm ràng buộc.

{Binding TestList} được chuyển thành Binding phiên bản lớp, không có kiến ​​thức về internal thành viên của lớp ViewModel của bạn.

+0

Không phải là tôi khuyên bạn nên làm điều này, nhưng bây giờ tôi tự hỏi nếu bạn có thể lấy đi bằng cách sử dụng 'nội bộ' nếu lắp ráp của bạn cũng có một' InternalsVisibleTo' của 'PresentationCore' lắp ráp ... – JerKimball

+0

Có lẽ nó có thể được thực hiện theo cách này, nhưng điểm của việc làm một điều như vậy là gì? – MarcinJuraszek

+0

Tuyệt đối không có lý do gì :) - Tôi chỉ muốn biết những gì là * có thể * trong mọi tình huống. – JerKimball

6

Điều này là do Ràng buộc dữ liệu sử dụng sự phản chiếu và do đó sẽ hiển thị quảng cáo cho các mục. Kể từ khi ràng buộc dữ liệu được thực hiện bên ngoài hội đồng của bạn - bên trong các thư viện WPF - nó không thể nhìn thấy các thành viên ngoài công lập.

Việc kết nối với thành viên không tồn tại sẽ không phát hành lỗi thời gian chạy mà là lỗi đầu ra gỡ lỗi với thông báo chứa thông tin chi tiết về thành viên bị thiếu.

+0

Cảm ơn bạn đã trả lời! Tệ quá, không thể chấp nhận một số câu trả lời ... –

Các vấn đề liên quan