【问题标题】:Design Time - Dynamic设计时间 - 动态
【发布时间】:2012-08-28 16:48:35
【问题描述】:

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

上面的例子不起作用。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • xaml 不处理 Expando 的原因是它没有实现 IDictionary,它实现了 IDictionary
    猜你喜欢
    • 2012-03-01
    • 2018-05-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2013-02-12
    • 2013-06-28
    相关资源
    最近更新 更多