设计时间 - 动态

时间:2012-08-28 16:48:36

标签: wpf visual-studio-2010 xaml dynamic design-time

我可以在设计时使用动态对象创建视图吗? (使用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>

以上示例不起作用。

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

我不知道自己是否清楚,但是如果你有什么可以帮助我的话会很棒。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

编辑:因为我认为你无法编译它,因为某些组件失败了:

  

错误1 Key属性只能用于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>

设计师应该能够处理这个问题。