0

動的オブジェクトを使用して、設計時にビューを作成できますか?(Visual Studio 2010を使用)

たとえば、または何か、それは可能ですか?

         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:dyn="clr-namespace:System.Dynamic;assembly=System.Core"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         mc:Ignorable="d" 

<d:DesignProperties.DataContext>
    <dyn:ExpandoObject>
        <dyn:ExpandoObject.Name>MyName</dyn:ExpandoObject.Name>
    </dyn:ExpandoObject>
</d:DesignProperties.DataContext>

上記の例は機能しません。

時々私は管理が複雑なクラスを持っています。また、設計時にはそれらを使用できません。動的型を使用するという考えは、バインディング(使用するプロパティ)を変更してビジョンを取得することではありません。

私がはっきりしていたかどうかはわかりませんが、あなたが私を助けることができる何かを持っているなら、それは素晴らしいことです。

4

1 に答える 1

1

これは、設計であろうと実行時であろうと、どのような場合でも機能しないはずです。

を使用できますExpandoObjectsが、辞書構文を介してのみ使用できます。

<dyn:ExpandoObject>
    <sys:String x:Key="Name">MyName</sys:String>
</dyn:ExpandoObject>

GUIデザイナーのそのジャンクがそれを処理できるかどうかはわかりませんが、コンパイルされたXAMLでこれが機能するかどうかもわかりません。

編集:私が思ったように、いくつかのコンポーネントが失敗するため、これをコンパイルすることはできません:

エラー1Key属性は、ディクショナリに含まれるタグ(ResourceDictionaryなど)でのみ使用できます。

まあ、それは大丈夫血まみれの辞書です...


ただし、マークアップ拡張機能を使用することはできますが、この回答DictionaryFactoryExtensionからを取得して、次のように変更できます。

public override object ProvideValue(IServiceProvider serviceProvider)
{
    var expando = (IDictionary<string,object>)new ExpandoObject();
    foreach (DictionaryEntry kvp in Dictionary)
        expando[(string)kvp.Key] = kvp.Value;

    return expando;
}

//The designer uses this for whatever reason...
public object this[object key]
{
    get { return this.Dictionary[key]; }
    set { this.Dictionary[key] = value; }
}

ExpandoObject次に、それを:のように使用できます。

<!-- Of course you can also hard-code the key-type in the class,
     it should be a string in all cases when using an ExpandoObject anyway -->
<local:DictionaryFactory KeyType="sys:String" ValueType="sys:Object">
    <sys:String x:Key="Name">MyName</sys:String>
</local:DictionaryFactory>

設計者はこれを処理できるはずです。

于 2012-08-28T16:54:27.363 に答える