0

このようなXAMLでは:

 <Button Tag="{Bindin Explain}"/>

ViewModelの場合:

private string explain = "";
public string Explain
{
    get { return explain; }
    set
    {
        if (explain != value)
        {
            explain = value;
            NotifyPropertyChanged("Explain");
        }
    }
}

しかし、それは機能しないので、MSDNから確認します:http: //msdn.microsoft.com/en-us/library/system.windows.frameworkelement.tag%28v=vs.95%29.aspx

値は文字列型であるため、Tagプロパティでバインドすることはできません。

説明は何ですか?

XAML値

  • object * —オブジェクト要素構文をサポートするSilverlightオブジェクトまたはカスタムオブジェクト(バッキングタイプは非抽象である必要があり、パブリックデフォルトコンストラクターをサポートする必要があります)。
  • string —文字列値(真の文字列、または文字列からの型変換をサポートするオブジェクト型の入力にすることができます)。

プロパティ値
タイプ:System.Object —目的の値。このプロパティにはデフォルト値はありません。

備考:
依存関係プロパティ識別子フィールド:TagProperty

このプロパティは、他のプログラミングモデルのタグプロパティに似ています。タグは、FrameworkElementまたは中間クラスから派生することなく、FrameworkElementに関する基本的なカスタム情報を格納できる既存のプロパティの場所を提供することを目的としています。

このプロパティはオブジェクトを取得するため、XAMLのTagプロパティを、文字列などの型コンバーターを使用するオブジェクト以外のものに設定するには、プロパティ要素を使用する必要があります。この方法で使用されるオブジェクトは、通常、標準のSilverlight XAML名前空間内にないため、XAMLオブジェクト要素として導入するために外部名前空間のマッピングが必要になる場合があります。

4

1 に答える 1

1

コントロールの要件よりも具体的なviewmodelプロパティタイプを持つことができるはずです。また、「オブジェクトタグ」はできるだけ具体的ではないため、何でも受け入れる必要があります。

Dimitriyが言ったように、それはタイプミスのせいだと思います。そうでない場合は、バインディングにMode=OneWayを追加してみてください。Silverlightにデフォルトで双方向または一方向があるかどうかは覚えていませんが、双方向バインディングにはより厳しい要件があるため、場合によっては違いが生じることもあります。


編集:MSDNは言う:

このプロパティはオブジェクトを取得するため、XAMLのTagプロパティを、文字列などの型コンバーターを使用するオブジェクト以外のものに設定するには、プロパティ要素を使用する必要があります。

このフラグメントには非常に奇妙な文法があります(少なくとも私にとっては、私は英語を母国語とはしていません)。それが何を意味するのかを理解するための鍵は、「プロパティ要素の使用法」という言葉にあります。文の部分に印を付けましょう:

このプロパティはオブジェクトを取得するため、// XAMLでは、//タグプロパティを//文字列などの型コンバーターを使用するオブジェクト以外の//に設定するには、//プロパティ要素を使用する必要があります。

キーワードは「XAML」と「propertyelement」です。ご覧のとおり、XAMLには、プロパティを設定するための2つの文法構造があります。最初は「XML属性」です。

<TextBlock Text="my mom has a cat" Foreground="Violet" />

2番目は「XML子要素」です。

<TextBlock>
    <TextBlock.Text>
        my mom has a cat
    </TextBlock.Text>
    <TextBlock.Foreground>
        Violet
    </TextBlock.Foreground>
</TextBlock>

通常、最初の名前は属性またはプロパティごと、2番目の要素はプロパティごとと呼ばれます。属性または子要素にテキスト(文字列!)のみが含まれている場合でも、XAMLパーサーは値の変換方法を理解するのに十分なほど賢いことに注意してください。プロパティはTextString型であるため、テキストが直接与えられますForegroundが、はブラシです。前景、背景、または塗りつぶしを色に設定するコードを試したことはありますか?直接それを行うことはできません。代わりに、Colors.Violetすなわちaを作成しnew SolidColorBrush(Colors.Violet)、それをプロパティに割り当てる必要がありました。では、テキスト「バイオレット」を割り当てるのはどうですか?Brush converter:) XAMLでは、パーサーは文字列を適切なブラシに変換する適切なコンバーターaをサイレントに使用します。

プロパティにはTag、おかしなことがあります。ですobject。XAMLパーサーは、どのような種類のオブジェクトが必要かをどのように知ることができますか?あなたは「125599」と書きます。Ok。Int32ですか?または文字列?またはhex-RGB-Color?

これが、MSDNが警告を発する理由です。文法があいまいなため失敗します。XAMLは、に設定されているすべてのテキスト値をTag文字列として扱います。整数または色を記述させたい場合は、実行する変換を正確に指定する必要があります。

xmlns:sys="clr-namespace:System"
....
<!-- those two are strings -->
<TextBlock Tag="1255599" />
<TextBlock>
    <TextBlock.Tag>
        115599
    </TextBlock.Tag>
</TextBlock>
....
<!-- those will be read as Int32 -->
<TextBlock Tag="{sys:Int32 1255599}" />
<TextBlock>
    <TextBlock.Tag>
        <sys:Int32>115599</sys:Int32>
    </TextBlock.Tag>
</TextBlock>

後者の2つでは、システム名前空間からInt32型のオブジェクトを作成するようにXAMLパーサーに命令します。したがって、テキストは整数として解析されます。

次に、これらの例を見てください。

<!-- I can put any object, right? -->
<TextBlock>
    <TextBlock.Tag>
        <TextBlock Foreground="Green">
           haha
        </TextBlock>
    </TextBlock.Tag>
</TextBlock>

<!-- I can put any object, right? -->
<TextBlock>
    <TextBlock.Tag>
        <MyClass>
              what happens to this text?
        </MyClass>
    </TextBlock.Tag>
</TextBlock>

変?でもねえ、タグはどんなオブジェクトでも取ることができます。最初の例では、XAMLパーサーにテキストブロックを作成し、テキストと色を設定し、そのようなオブジェクトをタグ値として配置するように命令します。すべてが明確です。しかし、2番目を見てください。ここでは何が起きるのですか?内部テキストはどのように「MyClass」に変換されますか?

問題は、誰も知らないということです。よくほとんど。MyClassがInt32の場合、Int32には.Netフレームワーク内のどこかにTYPE CONVERTERが登録されているため、文字列から整数へのコンバーターが起動します。MyClassがTextBlockの場合、内部テキストはTextPropertyに設定されます。これは、TextBlockが原因です。 .Netフレームワークのどこかにデフォルトのプロパティが登録されています。そしてMyClass?わからないので、コンパイラは、独自のソースコードのどこかに同様のものが登録されていない限り、文句を言います。

最後の4つの例を見てください。Int32をインラインと「verbose」構文の両方で割り当てる方法を確認してください。これは、Int32に型コンバーターが関連付けられているため、Int32がフレームワークに文字列をInt32に変換する方法を指示するためです。TextBlocksとMyCLassについては、それができなかったことを確認してください。タイプコンバータが関連付けられていないため、Tagプロパティをクラス「List」、「Grid」、または「MyClass」のオブジェクトに設定できません。フレームワークには、Tag = "{abc:MyClass mom has a cat}"という式が表示されますが、「mom hasacat」を「MyClass」に変換する方法はわかりません。

私は今それを願っています:

このプロパティはオブジェクトを取得するため、// XAMLでは、//タグプロパティを//文字列などの型コンバーターを使用するオブジェクト以外の//に設定するには、//プロパティ要素を使用する必要があります。

XAMLでは、型コンバーターが関連付けられていないオブジェクトを割り当てる場合は、ワイドプロパティ割り当て構文を使用し、オブジェクト構造を明示的に指定する必要があります。ただし、オブジェクトに型コンバーターがある場合、文字列はそのようなオブジェクトであるため、簡単な属性構文を使用して割り当てることができます。

免責事項:上記のコードは実行していないことに注意してください。マイナーなバグがある可能性があり、クラスの選択が不適切で機能しない可能性がありますが、一般的なメカニズムは問題ありません。そうでない場合は、私にメモを送ってください。

于 2012-08-17T14:11:22.983 に答える