2012-07-17 4 views
5

xamlのクラスを他のアセンブリから参照する際に問題があります。MC3074 - タイプが "clr-namespace ..."に存在しません

同じソリューションでは、2つのプロジェクトがあります。 1つはコントロール(ユーザーコントロールを保持する)と、1つはDataBinding(コンバーター/検証ルールを保持する)と呼ばれるものです。コントロールでは、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. を再構築するには、削除
  3. ネット(4.0、プロフィール)の同じバージョンをターゲットにしています名前空間定義の終わりからの「アセンブリ」定義。

上記のいずれも機能していません。どこに間違っているのかに関する提案はありますか?

EDIT

マイFILEEXISTSの検証:など

new GuiParts.DataBinding.Validators.FileExistsRule(); 

だから、アイブは私の名前空間を持って正しい:

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

私はエラーなしの背後にあるコードに次のように呼び出すことができます。

+0

あなたしている方法は、1することができ行の文: 'return File.Exists((文字列)の値)?新しいValidationResult(false、 "ファイルは存在しません"):新しいValidationResult(true、null); ' –

+0

これを解明したことがありますか? –

答えて

3

はこれを試してみてください:

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

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

+1これは私を助け、私はアセンブリを指定する必要がありました。 – SwDevMan81

2
  1. あなたのターゲットアセンブリのクラスは公開されていますか?
  2. バリデータのフィールドは公開されていますか?
  3. 名前空間GuiParts.DataBindingは正しいですか?
+0

詳細を編集した質問 – richzilla

+0

これらの質問はその時点で必要でした。なぜなら、質問にはそれほど細かいことがなかったからです。投票するときはそれを考慮してください。 –

2

私はあなたが抱えている問題が何であるかはよく分からないが、あなたは、代わりにあなたの組み立ておよびCLR名前空間の親しみやすい名前空間の定義を作成することができます。実際には、このテクニックを使用してさまざまな名前空間を1つのXML名前空間にグループ化します。これはXmlnsPrefixAttributeXmlnsDefinitionAttributeを使用して行います。例えば

:あなたはXAMLでxmlnamespaceを参照したいとき

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

その後、あなたは、単に実行します。

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

注意を、私はReSharperのを使用しますが、私はよ確かにこれはVisual Studioでも自然に動作します。 xmlnsインポートを入力せずに名前空間内のオブジェクトを使用しようとすると、それを解決するときに自動的に指定された接頭辞を持つ名前のついた名前空間が使用されます。また、本当にいいですし、複数のclr名前空間を単一のXML名前空間にマップできるので、xml名前空間とclr名前空間の間に1対1の関係があるのを避けるのに役立ちます。

また、具体的にどのような問題があるのか​​よく分かりませんが、これはおそらくそれを修正し、clr-namespacesとアセンブリ情報を使用するよりも優れています。あなたがxmlnsの衝突に遭遇しないように、またはclr/assembly名前空間に戻る必要があるので、ユニークなものを思いついてください。


ああ、最後に一つ...あなたは(あなたがすべき)、後方互換性のために自分自身をでロックを心配しないでください、あなたのXML名前空間の命名体系でバージョン管理を利用したい場合。 XmlnsCompatibleWithAttributeを利用して、新しいxml名前空間にマップするように外部アセンブリを更新した場合に、古いフレンドリ名前空間を利用したコードが壊れないようにすることができます。

あなたはもともとあなたがアセンブリ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")] 
関連する問題