2012-07-17 20 views
5

從其他程序集中引用xaml中的類時出現問題。「clr-namespace ...」中不存在MC3074 - 類型

在同樣的解決方案中,我有兩個項目。一個名爲Controls(用於保存用戶控件)和一個名爲DataBinding(保存轉換器/驗證規則)。在一個控件中,im試圖在xaml中引用驗證規則:

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

我的項目引用包含我的類的項目。香港專業教育學院在我Control.xaml頂部添加了此聲明:

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

然而,當我編譯,我得到一個錯誤:

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

類肯定存在,我可以把它叫做代碼後面沒有問題,但沒有通過xaml。如果我將課程移到同一個項目中,我再也沒有問題了。香港專業教育學院看到這裏的其他問題,並嘗試以下操作:

  1. 清洗和重建的所有相關項目
  2. 確保所有項目都瞄準同一版本的.NET(4.0,全部檔案)的
  3. 拆除從命名空間定義的末尾'裝配'定義。

以上都沒有奏效。任何關於我哪裏出錯的建議?

編輯

我FILEEXISTS驗證:

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; 
     } 
    } 
} 

我可以調用以下代碼背後沒有任何錯誤:

new GuiParts.DataBinding.Validators.FileExistsRule(); 

所以香港專業教育學院得到了我的名字空間等正確的。

+0

你方法可以是1行語句:'返回File.Exists((字符串)值)?新的ValidationResult(false,「文件不存在。」):new ValidationResult(true,null);' – 2012-07-17 19:41:53

+0

有沒有想到這一點? – 2013-01-08 00:30:23

回答

3

試試這個:

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

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

+1這幫了我,我需要指定程序集。 – SwDevMan81 2014-03-26 20:13:48

2
  1. 您的目標程序集中的課程是否公開?
  2. Validators中的字段是公開的嗎?
  3. 您的名字空間GuiParts.DataBinding是否正確?
+0

編輯更多詳細問題 – richzilla 2012-07-17 19:28:52

+0

這些問題在當時是必要的,因爲問題的細節非常少,這是唯一可以提供的建議。投票時請考慮。 – 2013-04-23 19:13:49

2

雖然我不知道你所遇到的問題是,則可以選擇創建您的程序集和CLR命名空間的一個友好的命名空間定義。實際上,我使用這種技術將各種名稱空間分組到一個XML命名空間中......您可以使用XmlnsPrefixAttributeXmlnsDefinitionAttribute來執行此操作。

例如:

[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")] 

然後,當你要引用的XML命名空間中的XAML中,你只需做:

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

請注意,我用ReSharper的,但我當然,這在Visual Studio中也很自然。如果您沒有鍵入xmlns導入並嘗試在名稱空間中使用對象,那麼當您去解析它時,它將自動使用具有指定前綴的友好名稱命名空間。另外,它非常好,可以幫助您避免在xml命名空間和clr命名空間之間建立1:1關係,因爲您可以將多個clr命名空間映射到單個xml命名空間。

再一次,我不確定你有什麼特別的問題,但這可能會解決它,並比使用clr命名空間和程序集信息更好。只要確保提出一些獨特的東西,以避免遇到xmlns衝突,或者您必須返回到clr/assembly命名空間。


哦,還有最後一件事...如果你想利用你的XML命名空間的命名方案版本(你應該),不擔心自己鎖定的向後兼容性。如果您更新外部程序集以映射到更新的xml名稱空間,則始終可以利用XmlnsCompatibleWithAttribute確保使用舊的友好名稱空間的代碼不會中斷。

例如,如果你原來有你組裝指向2012的命名空間,然後將其切換到2013的命名空間,因爲你更新的組件......

// 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")] 
相關問題