2012-08-28 122 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