Blend 3中的PropertyValueEditor和DependencyObject - Silverlight DesignTime支持

时间:2009-11-24 19:58:50

标签: silverlight expression-blend blend design-time

我正在处理一组具有许多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做些什么?我觉得这会自动发生吗?

2 个答案:

答案 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 CodeNing Zhang (Awesome Design Time Dev) explains about ModelItem

如果您有后续问题,我会考虑通过Silverlight Insiders邮件列表ping PeteBl或UnniR。

此致
- 贾斯汀

答案 1 :(得分:0)

它部分解决了我的问题。我正在与UnniR进行对话以进行跟进。 我无法看到我如何将它与PropertyValueEditor一起使用,但是对于默认值,这很棒,我将尽快实现。

感谢。