wpf - WPF/Silverlight 依赖属性延迟 "rendering"?

标签 wpf silverlight data-binding dependency-properties

有没有办法知道第一次通过 XAML 绑定(bind)访问依赖属性,以便我可以在需要时实际“呈现”该属性的值?

我有一个对象(从 Control 派生的类),该对象具有多个可能包含 100 或 1000 个点的 PointCollection 依赖属性。每个属性可能会以不同的方式排列点以用于不同类型的形状(折线、多边形等 - 它比这更复杂,但你明白了)。通过模板,不同的 XAML 对象使用 TemplateBinding 来访问这些属性。由于我的对象使用模板,我永远不知道我的对象可能使用什么 XAML 形状 - 所以我永远不知道它们可能会或可能不会绑定(bind)到哪些属性。我只想在实际需要时填写这些 PointCollections。

通常在 .NET 中,我只会在属性的 getter 中添加一些逻辑,但 XAML 数据绑定(bind)会绕过这些逻辑。

我需要一个 WPF 和 Silverlight 兼容的解决方案。

我希望有一个解决方案能够避免给我的对象的用户带来任何额外的复杂性。


更新

我发现做到这一点的一种方法是使用 Value Converters 。在我的情况下,我有多个点集合。有一个主要部门。包含数据通常形状的属性。需要两种替代形状以便在其他区域/环境中重复使用。

起初我有 3 个部门。 Prop 。但是,我可以只拥有一个属性(通常的形状),并使用转换后的值将点转换为我的其他 2 个所需形状。这样做我只在控件中制作一组点。将点转换为次要形状的费用仅在使用时才会产生。现在,我的主控件不需要预测数据需要如何查找向控件抛出的每个可能的模板 - 现在是模板设计者的问题。


更新2

当然,INotifyPropertyChanged 和常规属性是处理此问题的推荐方法。

最佳答案

您不必使用依赖属性来启用数据绑定(bind)。但是,如果源处的更改应传播到绑定(bind)的目标,则必须实现 INotifyPropertyChanged。 “普通”.NET 属性很容易延迟加载,可能如下所示:

PointCollection points

public PointCollection Points {
  get {
    return this.points ?? (this.points = CreatePoints());
  }
}

PointCollection CreatePoints() {
  // ...
}

我不确定如何将 INotifyPropertyChanged 放入您的控件中,但是您的控件向系统的其他部分提供数据听起来有点奇怪。也许您需要创建一个包含数据的 View 模型,然后您可以让您的控件进行数据绑定(bind)。

关于wpf - WPF/Silverlight 依赖属性延迟 "rendering"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1465885/

相关文章:

ios - 与 Silveright 和 iPad 客户端一起使用的推荐绑定(bind)是什么

silverlight - 如何判断网格单元的大小?

wpf - WPF 中数据绑定(bind)时 "unavailable"值的模式

c# - 将 DataGrid 单元格绑定(bind)到索引属性

带有用户控件的 WPF 数据绑定(bind)

c# - 检索 ODBC 表并插入 SQL Server CE 数据库

c# - 在 WPF 中绘制大量可视元素的建议(简单)方法?

c# - RadioButton ContentStringFormat 不起作用

c# - 如何获得带有文本环绕的文本 block 以填充 View 框

silverlight - 如何在Silverlight中实现 "Please Wait"屏幕