2013-10-31 11 views
6

Tôi đang thử một số thứ khác nhau bằng cách sử dụng MVVM. Trong các thuộc tính ViewModel của chúng tôi được liên kết với Chế độ xem là công khai. Tôi lấy ví dụ về một nút ràng buộc. Đây là một mẫu đơn giản.Làm cho tài sản ràng buộc nội bộ thay vì công khai trong ViewModel

View.xaml:

<Button Content="Test Button" Command="{Binding TestButtonCommand}" /> 

ViewModel.cs

private ICommand _testButtonCommand; 
public ICommand TestButtonCommand 
{ 
    get { return _testButtonCommand?? (_testButtonCommand= new RelayCommand(SomeMethod)); } 
} 

Ở đây câu hỏi của tôi là chúng ta có thể làm cho TestButtonCommand nội bộ thay vì công cộng? Nội bộ có nghĩa là nó có thể truy cập vào dự án hiện tại để họ không phải là bất kỳ vấn đề làm điều đó? Nhưng khi tôi cố gắng làm điều đó thì nó không hiệu quả. Thêm một breakpoint trong getter không được nhấn. Vậy tại sao chúng ta không thể làm cho nó bên trong.

Đây là liên kết từ msdn.

http://msdn.microsoft.com/en-us/library/ms743643.aspx

Các thuộc tính bạn sử dụng thuộc tính nguồn như bắt buộc đối với một ràng buộc phải tài sản công cộng của lớp học của bạn. Các thuộc tính giao diện được xác định rõ ràng không thể được truy cập cho các mục đích ràng buộc, cũng như các thuộc tính được bảo vệ, riêng tư, nội bộ hoặc ảo không có triển khai cơ sở.

Tại sao chúng tôi không thể thực hiện việc này? Trong trường hợp truy cập nội bộ giống như công chúng nếu làm việc trong cùng một dự án. Vậy tại sao chúng ta không thể sử dụng nội bộ ở đây. Phải có một lý do mà chúng nên được công khai, và tôi đang tìm kiếm lý do đó.

internal ICommand TestButtonCommand { ...... } 
+3

Vì [bạn chỉ có thể liên kết với các thuộc tính công khai, các thuộc tính con và các bộ chỉ mục hoặc bất kỳ đối tượng CLR nào] (http://msdn.microsoft.com/en-us/library/ms743643.aspx). Tại sao nhóm WPF đã đi với quyết định thiết kế như vậy? Tôi không biết, bạn nên hỏi họ :) –

+0

Microsoft của nó, vì vậy chúng tôi không thể làm bất cứ điều gì, –

Trả lời

11

Trường hợp truy cập nội bộ giống như công khai nếu làm việc trong cùng dự án . Vậy tại sao chúng ta không thể sử dụng nội bộ ở đây. Phải có một lý do rằng những điều này phải được công khai và tôi đang tìm lý do đó.

Bạn chỉ có câu trả lời trong câu hỏi của mình vì chỉ có thể truy cập nội bộ trong cùng một hội đồng chứ không phải từ bên ngoài. Đây là lý do duy nhất liên kết với nội bộ không hoạt động vì ràng buộc được giải quyết bằng công cụ liên kết chứ không phải bởi assembly của bạn và trong assembly riêng của nó PresentationFramework.dll để chính xác nếu bạn đang tìm kiếm.

+2

Sau đó, làm thế nào điều này có thể ràng buộc để xem lớp mô hình đó là chính nó nội bộ? –

+1

Người đàn ông, ồ, người đàn ông đã khiến tôi phát điên trong Winforms. Rõ ràng và chưa phải tất cả cùng một lúc. Cảm ơn. –

7

Binding chỉ được hỗ trợ cho các thuộc tính công khai. MSDN tham khảo:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

Như trích dẫn trong các tài liệu tham khảo

Các thuộc tính bạn sử dụng thuộc tính nguồn như bắt buộc đối với một ràng buộc phải được tài sản công cộng của lớp học của bạn. Không thể truy cập giao diện được xác định rõ ràng thuộc tính cho mục đích ràng buộc, cũng như không được bảo vệ, các thuộc tính riêng, nội bộ hoặc ảo không thực hiện cơ sở .

+0

Tôi đang cố gắng tìm thấy ở đây là lý do tại sao chúng tôi không thể sử dụng nội bộ. Nó giống như công chúng nếu chúng ta đang làm việc trong cùng một dự án. –

0

Thuộc tính nội bộ được tạo đang phá vỡ thiết kế OO tốt và đang phá vỡ đóng gói. Bạn có thể sử dụng bộ truy cập bộ bên trong (và bộ tiếp cận công khai) cho trường hợp của bạn.

public ICommand SaveCommand 
{ 
    get; 
    internal set; 
} 

Nếu bạn có trường được đóng gói thành thuộc tính, bạn nên luôn luôn là quy tắc để luôn truy cập trường đó thông qua tài sản ngay cả trong lớp học. Đó là thực hành tốt nhất.

1

Chế độ hiển thị internal thực sự chỉ có ý nghĩa đối với trình biên dịch và trình xác minh IL, vì chúng biết toàn bộ ngữ cảnh của quyền truy cập thành viên; công cụ gắn kết WPF không. Nó biết rằng một ràng buộc tồn tại trên một thuộc tính; nó không có ý tưởng người thiết lập tài sản. Nó có thể đã được đặt trong XAML, hoặc động tại thời gian chạy (về mặt kỹ thuật, ngay cả khi bạn đặt nó trong XAML, nó vẫn được áp dụng động).

Vì không có cách nào để thực thi các quy tắc truy cập, cho phép ràng buộc với các thuộc tính internal tương đương với việc cho phép gắn kết với private thuộc tính, không phải là public thuộc tính.

0

Từ http://msdn.microsoft.com/en-us/library/ms743643.aspx

Đối với tài sản CLR, dữ liệu ràng buộc công trình chừng nào động cơ ràng buộc có thể truy cập các tài sản nguồn ràng buộc sử dụng phản ánh. Nếu không, công cụ liên kết đưa ra cảnh báo rằng thuộc tính không thể được tìm thấy và sử dụng giá trị dự phòng hoặc giá trị mặc định, nếu nó có sẵn.

2

Rõ ràng, nó phụ thuộc vào những gì bạn đang cố gắng đạt được từ tình huống này - bạn không nói rõ mục tiêu tổng thể là gì. Tôi vừa gặp một vấn đề tương tự với mã của tôi, và cũng đã xảy ra khi một giải pháp cho trường hợp của tôi. Một trong các thư viện của tôi chứa các đối tượng trợ giúp với các thuộc tính khác nhau, nhưng khi chúng được sử dụng trong dự án ứng dụng, tôi chỉ muốn xem các thuộc tính được sử dụng cho tôi - tôi muốn ẩn, ví dụ, các thuộc tính Command.

Giải pháp của tôi để ẩn chúng từ 'sử dụng' của thư viện là thêm thuộc tính

<EditorBrowsable(EditorBrowsableState.Never)> 

cho từng tài sản đó mang ít hoặc không quan tâm đến tôi.

Hy vọng rằng sẽ giúp ai đó!

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