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>

上面的例子不起作用。

有时我的课程管理起来很复杂。而且我不能在设计时使用它们,使用动态类型的想法不会改变绑定(我将使用的属性)并获得愿景。

我不知道我是否清楚,但如果你有一些可以帮助我的东西会很棒。

4

1 回答 1

1

这在任何情况下都不应该起作用,无论是设计还是运行时。

您可以使用ExpandoObjects,但只能通过字典语法:

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

虽然我不知道 GUI 设计师的垃圾是否能够处理,我也不知道这是否适用于已编译的 XAML。

编辑:因为我认为你不能编译它,因为某些组件失败:

错误 1 ​​Key 属性只能用于字典中包含的标记(例如 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 回答