我正在处理一组具有许多DependencyProperties的控件。属性本身是DependencyObjects,并在属性的get方法中创建。在Get方法中,它们也使用SetValue()方法设置回propertybag,因此它们在Xaml中实际上是有效的,并且它们的属性可以是故事板,而无需在可视化树中显式创建。
这些DependencyObjects的所有属性也都是DependencyProperties,用于支持DataBinding。如上所述,它们可以在故事板中使用。
与此同时,我正在为这些属性开发Blend 3的特殊设计时支持,并以Control的形式创建了一个InlineEditorTemplate。我创建模板并为PropertyValueEditor设置它,如下所示:
var vectorEditControl = new FrameworkElementFactory(typeof (VectorEditorControl));
var dataTemplate = new DataTemplate {VisualTree = vectorEditControl};
InlineEditorTemplate = dataTemplate;
在控制中我有以下内容:
<Grid DataContext="{Binding Value}">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Path=X, Mode=TwoWay}"/>
<TextBox Text="{Binding Path=Y, Mode=TwoWay}"/>
<TextBox Text="{Binding Path=Z, Mode=TwoWay}"/>
</StackPanel>
</Grid>
编辑器显示,我可以编辑数据。即使在调试时,我看到它实际上将数据设置回DependencyObjects上的DependencyProperties,但Xaml没有任何反应。因此,当我关闭Xaml文件并再次打开它时,数据实际上不会以任何方式存在于Xaml中并丢失。
我是否需要专门为它实际进入Xaml做些什么?我觉得这会自动发生吗?
答案 0 :(得分:1)
优秀的问题!
你遇到的一个核心问题就是Blend / Cider中的PropertyEditors最终数据绑定的误解。
考虑这个对象图:
- MyControl
- MyControl.MyProperty
--- FooClass
---- FooClass.BarProperty
让我们看看我们有一个属性MyControl.MyProperty的PropertyEditor(任何类型:内联,对话或扩展)的场景。 在MyPropertyPropertyEditor中,你希望得到一个完全可设置的FooClass副本,并能够操纵它的成员。 这是一个很好的假设,但错误的假设。
核心问题是Blend / Cider拥有精心设计的数据结构,可以在设计时代表您的模型。 Blend / Cider与实际控件的交互方式大约有3-5级抽象 创建这些抽象级别允许Expression Blend / Visual Studio设计器在framewroks(Silverlight / WPF)之间使用,并支持高级场景(如属性事务和属性链接)。
因此,实际获得DataBind的值只是这些抽象级别中的一个 不相信我?在自定义PropertyEditor中,注册this.DataContextChanged事件并检出this.DataContext中的类型。你最终会获得PropertyValue课程(或其中一位朋友)。
您希望持久保存到XAML(并在设计图面上显示)的每个属性更改都应该通过这些抽象层。
你必须问自己的问题是“我在哪里可以获得我的PropertyValue.Value属性实例的其中一个absteaction类?”。
好吧,如果我是你,我会做的是在MyControl.MyProperty周围创建一个ModelItem,并将其设置为PropertyEditor.DataContext。 我们已经提供了一个在Silverlight Toolkit中使用ModelFactory.CreateItem作为Chart DefaultInitializer的一部分的示例:Source Code,Ning Zhang (Awesome Design Time Dev) explains about ModelItem
如果您有后续问题,我会考虑通过Silverlight Insiders邮件列表ping PeteBl或UnniR。
此致
- 贾斯汀
答案 1 :(得分:0)
它部分解决了我的问题。我正在与UnniR进行对话以进行跟进。 我无法看到我如何将它与PropertyValueEditor一起使用,但是对于默认值,这很棒,我将尽快实现。
感谢。