2012-08-28 68 views
0

我可以在設計時使用動態對象創建視圖嗎? (與視覺工作室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> 

上面的例子不工作。

有時我有班級複雜的管理。我不能在設計時使用它們,使用動態類型的想法不會改變綁定(我將使用的屬性)並獲得願景。

我不知道我是否清楚,但如果你有什麼可以幫助我會很好。

回答

1

這不應該在任何情況下工作,無論是設計還是運行時。

您只能通過字典語法使用ExpandoObjects,但:

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

雖然我不知道,如果一個GUI設計的那些垃圾是能夠處理,我也不知道這是否編譯XAML 。

編輯:,因爲我以爲,因爲某些部件出現故障時,你不能編譯如下:

錯誤1鍵屬性只能包含在一個Dictionary(如ResourceDictionary中)的標籤上使用。

嗯,這是一個血腥的字典好嗎?


可以使用markup extension不過,你可以從this answer得到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> 

設計師應該能夠處理這個問題。

+0

這對我的Windows/UserControls/Etc來說非常棒。謝謝! –

+0

xaml不處理Expando的原因是因爲它沒有實現IDictionary,它實現了IDictionary