1

我正在研究一组具有多个 DependencyProperties 的控件。属性本身就是 DependencyObject,并在属性的 get 方法期间创建。在 Get 方法期间,它们还使用 SetValue() 方法设置回属性包,因此它们实际上在 Xaml 中是有效的,并且它们的属性可以在情节提要中进行,而无需在可视化树中显式创建。

这些 DependencyObject 的所有属性也都作为 DependencyProperties,用于支持 DataBinding。如上所述,它们可以在情节提要中使用。

同时,我正在为这些属性开发 Blend 3 的特殊设计时支持,并以控件的形式创建了一个 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 吗?我的印象是这会自动发生?

4

2 回答 2

1

好问题!

您遇到的核心问题是对 Blend/Cider 中的 PropertyEditors 最终将数据绑定到什么产生误解。

考虑这个对象图:
- MyControl
-- MyControl.MyProperty
--- FooClass
---- FooClass.BarProperty

让我们看一个场景,其中我们有一个 PropertyEditor(任何类型:Inline、Dialog 或 Extended)到属性 MyControl.MyProperty。在 MyPropertyPropertyEditor 中,您希望获得 FooClass 的完全可设置副本并能够操作它的成员。这是一个很好的假设,但却是错误的假设。

核心问题是 Blend/Cider 具有精细的数据结构,可以在设计时代表您的模型。Blend/Cider 如何与实际控件交互大约有 3-5 个抽象级别。
创建这些抽象级别允许在框架(Silverlight / WPF)之间利用 Expression Blend / Visual Studio 设计人员并支持高级方案(如属性事务和属性链接)。

因此,您实际获得的 DataBind 值只是这些抽象级别之一。
不相信我?在您的自定义 PropertyEditor 中,注册 this.DataContextChanged 事件并检查 this.DataContext 中的类型。您最终将获得PropertyValue类(或它的朋友之一)。

您希望保留到 XAML(并显示在设计图面上)的每一个属性更改都应该通过这些抽象层。

您必须问自己的问题是“我在哪里可以为我的 PropertyValue.Value 属性实例获得这些弃权类之一?”。

好吧,如果我是您,我会在 MyControl.MyProperty 周围创建一个 ModelItem 并将其设置为您的 PropertyEditor.DataContext。我们已经发布了一个在 Silverlight 工具包中使用 ModelFactory.CreateItem 的示例,作为 Chart DefaultInitializer 的一部分: 源代码Ning Zhang(Awesome Design Time Dev)解释了关于 ModelItem

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

真诚的
——贾斯汀

于 2009-11-25T13:14:14.360 回答
0

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

谢谢。

于 2009-11-27T18:11:59.667 回答