2012-07-17 22 views
5

Im gặp sự cố khi tham chiếu các lớp trong xaml từ các assembly khác.MC3074 - loại không tồn tại trong "clr-namespace ..."

Trong cùng một giải pháp, tôi có hai dự án. Một được gọi là Điều khiển (để giữ các điều khiển người dùng) và được gọi là DataBinding (giữ các quy tắc chuyển đổi/xác thực). Trong điều khiển, im cố gắng tham chiếu quy tắc xác thực trong xaml:

<Binding.ValidationRules> 
    <databind:Validators.FileExistsRule /> 
</Binding.ValidationRules> 

Dự án của tôi tham chiếu dự án chứa các lớp của tôi. Ive thêm tuyên bố này ở đầu Control.xaml tôi:

xmlns:databind="clr-namespace:GuiParts.DataBinding;assembly=DataBinding" 

Tuy nhiên, khi tôi biên soạn, tôi nhận được một lỗi:

The tag 'Validators.FileExistsRule' does not exist in XML namespace 'clr-namespace:GuiParts.DataBinding;assembly=DataBinding'. 

Lớp chắc chắn tồn tại, tôi có thể gọi nó là trong mã đằng sau không có vấn đề gì, nhưng không phải thông qua xaml. Nếu tôi di chuyển lớp học đến cùng một dự án, một lần nữa, tôi không có vấn đề gì. Ive nhìn thấy câu hỏi khác trên đây, và đã thử như sau:

  1. Làm sạch và xây dựng lại tất cả các dự án có liên quan
  2. Đảm bảo tất cả các dự án đang nhắm mục tiêu cùng một phiên bản của Net (4.0, đầy đủ hồ sơ)
  3. Tháo định nghĩa 'assembly' từ cuối định nghĩa vùng tên.

Không có điều nào ở trên có hiệu quả. Bất cứ đề nghị như nơi im đi sai?

EDIT

FileExists My Validator:

namespace GuiParts.DataBinding.Validators 
{ 
    /// <summary> 
    /// Validates that the file with the specified name exists 
    /// </summary> 
    public class FileExistsRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
     ValidationResult res = null; 
     res = (! File.Exists((string)value)) 
        ? new ValidationResult(false, "File does not exist") 
        : new ValidationResult(true, null); 
     return res; 
     } 
    } 
} 

tôi có thể gọi như sau trong mã đằng sau mà không cần bất kỳ lỗi:

new GuiParts.DataBinding.Validators.FileExistsRule(); 

Vì vậy, ive có không gian tên của tôi, vv đúng.

+0

Bạn phương pháp đang có thể là một 1 tuyên bố dòng: 'return File.Exists ((string) value)? ValidationResult mới (sai, "File không tồn tại."): ValidationResult mới (true, null); ' –

+0

Bao giờ con số này ra? –

Trả lời

3

Hãy thử điều này:

xmlns:databind="clr-namespace:GuiParts.DataBinding.Validators;assembly=DataBinding" 

<Binding.ValidationRules>  
    <databind:FileExistsRule />  
</Binding.ValidationRules> 
+0

+1 Điều này đã giúp tôi, tôi cần phải chỉ định hội đồng. – SwDevMan81

2
  1. Lớp học của bạn trong hội đồng mục tiêu có được công khai không?
  2. Trường có trong Trình xác thực, công khai không?
  3. Không gian tên của bạn là GuiParts.DataBinding có đúng không?
+0

Câu hỏi đã chỉnh sửa chi tiết hơn – richzilla

+0

Những câu hỏi này là cần thiết vào lúc đó bởi vì câu hỏi có rất ít chi tiết đây là lời khuyên duy nhất mà người ta có thể cung cấp. Hãy xem xét rằng khi bỏ phiếu. –

2

Trong khi tôi không chắc chắn những gì các vấn đề bạn đang gặp phải là, bạn có thể lựa chọn tạo ra một định nghĩa namespace thân thiện hơn để lắp ráp và CLR của bạn không gian tên. Trong thực tế, tôi sử dụng kỹ thuật này để nhóm các không gian tên khác nhau vào một không gian tên XML ... Bạn làm điều này bằng cách sử dụng các số XmlnsPrefixAttributeXmlnsDefinitionAttribute s.

Ví dụ:

[assembly: XmlnsPrefix("http://my.xml.namespace.com/", "databind")] 
[assembly: XmlnsDefinition("http://my.xml.namespace.com/", 
    "GuiParts.DataBinding")] 
[assembly: XmlnsDefinition("http://my.xml.namespace.com/", 
    "GuiParts.DataBinding.Validators")] 

Sau đó, khi bạn muốn tham khảo các xmlnamespace trong XAML của bạn, bạn chỉ cần làm:

xmlns:databind="http://my.xml.namespace.com/" 

Lưu ý, tôi sử dụng ReSharper, nhưng tôi chắc chắn điều này cũng hoạt động tự nhiên trong Visual Studio. Nếu bạn không nhập vào xmlns nhập khẩu và cố gắng sử dụng một đối tượng trong không gian tên, thì khi bạn đi đến giải quyết nó, nó sẽ tự động sử dụng không gian tên có tên thân thiện hơn với tiền tố được chỉ định. Ngoài ra, nó thực sự tốt đẹp và giúp bạn tránh có mối quan hệ 1: 1 giữa các không gian tên xml và các không gian tên clr vì bạn có thể ánh xạ nhiều không gian tên clr vào một vùng tên xml duy nhất.

Một lần nữa, tôi không chắc chắn vấn đề bạn đang gặp phải là gì, nhưng điều này có thể sẽ khắc phục và tốt hơn là sử dụng các không gian tên và thông tin lắp ráp. Chỉ cần chắc chắn để đến với một cái gì đó độc đáo, do đó bạn không chạy vào xmlns va chạm hoặc bạn sẽ phải quay trở lại clr/lắp ráp namespacing.


Ồ, và điều cuối cùng ... nếu bạn muốn sử dụng phiên bản trong lược đồ đặt tên không gian tên xml của mình (bạn nên), đừng lo lắng về khả năng tương thích ngược. Bạn luôn có thể sử dụng XmlnsCompatibleWithAttribute để đảm bảo rằng mã sử dụng không gian tên thân thiện cũ không phá vỡ nếu bạn cập nhật các assembly bên ngoài của bạn để ánh xạ tới một không gian tên xml mới hơn.

Ví dụ, nếu bạn ban đầu có bạn đang lắp ráp trỏ đến một không gian tên năm 2012, sau đó chuyển nó vào một namespace 2013 bởi vì bạn cập nhật lắp ráp ...

// Previous Assembly version 
//[assembly: XmlnsDefinition("http://schemas.xyzcorp.com/wpf/2012", 
// "Xyz.Databinding")] 

[assembly: XmlnsCompatibleWith("http://schemas.xyzcorp.com/wpf/2012", 
    "http://schemas.xyzcorp.com/wpf/2013")] 
[assembly: XmlnsDefinition("http://schemas.xyzcorp.com/wpf/2013", 
    "Xyz.Databinding")] 
Các vấn đề liên quan