我可以在设计时使用动态对象创建视图吗? (使用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>
以上示例不起作用。
有时我的课程很复杂。我不能在设计时使用它们,使用动态类型的想法不是改变绑定(我将使用的属性)并获得愿景。
我不知道自己是否清楚,但是如果你有什么可以帮助我的话会很棒。
答案 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>
设计师应该能够处理这个问题。