8

他のアセンブリからxamlのクラスを参照するのに問題があります。

同じソリューションで、2つのプロジェクトがあります。1つはControls(ユーザーコントロールを保持するため)と呼ばれ、もう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. すべてのプロジェクトが同じバージョンの.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();

だから私は私の名前空間などを正しくしました。

4

3 に答える 3

5

これを試して:

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

<Binding.ValidationRules>    
    <databind:FileExistsRule />    
</Binding.ValidationRules> 
于 2012-07-17T19:32:12.100 に答える
3

発生している問題が何であるかはわかりませんが、代わりに、アセンブリとCLR名前空間に対してよりわかりやすい名前空間定義を作成することもできます。実際、私はこの手法を使用して、さまざまな名前空間を1つのXML名前空間にグループ化します...これは、とを使用して行いXmlnsPrefixAttributeますXmlnsDefinitionAttribute

例えば:

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

次に、xamlのxmlnamespaceを参照する場合は、次のようにします。

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

注:私はReSharperを使用していますが、これはVisualStudioでも自然に機能すると確信しています。xmlns importを入力せずに名前空間でオブジェクトを使用しようとすると、それを解決しようとすると、指定されたプレフィックスを持つ、より親しみやすい名前空間の名前空間が自動的に使用されます。また、これは非常に優れており、複数のclr名前空間を単一のxml名前空間にマップできるため、xml名前空間とclr名前空間の間に1:1の関係を持たないようにするのに役立ちます。

繰り返しますが、あなたが具体的にどのような問題を抱えているのかはわかりませんが、これでおそらく修正され、clr-namespacesとアセンブリ情報を使用するよりも優れています。xmlnsの衝突に遭遇しないように、またはclr / assemblyの名前空間に戻る必要がないように、必ず独自の何かを考え出すようにしてください。


ああ、最後にもう1つ... 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")]
于 2012-07-17T19:55:40.767 に答える
3
  1. ターゲットアセンブリのクラスは公開されていますか?
  2. バリデーターのフィールドは公開されていますか?
  3. 名前空間GuiParts.DataBindingは正しいですか?
于 2012-07-17T19:17:36.777 に答える