2009-09-23 66 views
2

有没有办法知道第一次通过XAML绑定访问Dependency属性,所以我实际上可以在需要时“呈现”属性的值?延迟“呈现”WPF/Silverlight依赖属性?

我有一个对象(派生自Control的类)有几个PointCollection依赖属性可能包含100或1000的点。每个属性都可以按照不同类型的形状(Polyline,Polygon等等)使用不同的方式来安排点 - 它比这更复杂,但你明白了)。通过模板,不同的XAML对象使用TemplateBinding来访问这些属性。由于我的对象使用模板,我永远不知道XAML形状可能会用于我的对象 - 所以我永远不知道它们可能绑定或不绑定到的属性。我只想在实际需要时填入这些PointCollections。

通常在.NET中,我只想在Property的getter中添加一些逻辑,但是这些逻辑被XAML数据绑定绕过。

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

我很喜欢这个解决方案,可以避免为我的对象的用户带来额外的复杂性。


更新我发现这样做是使用Value Converters

的一种方式。在我的情况下,我有多个点集合。有一个主要的部门。包含数据通常形状的属性。需要在其他区域/上下文中重复使用两种替代形状。

起初我有3局。道具。但是,我可能只有一个属性(通常的形状),并使用转换后的值将这些点转换为其他2个所需的形状。这样做,我只能在控件中创建一组点。将点转换为次形状的费用仅在使用时发生。现在,我的主要控件不需要预测数据如何查找控件上引发的每个可能的模板 - 现在是模板设计器的问题。


更新2

当然INotifyPropertyChanged的和经常性的来处理这个推荐的方法。

回答

3

您不一定必须使用依赖项属性来启用数据绑定。但是,如果将源处的更改传播到绑定的目标,则必须实施INotifyPropertyChanged。 “正常” .NET属性是很容易延迟加载或许是这样的:

PointCollection points 

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

PointCollection CreatePoints() { 
    // ... 
} 

我不知道你如何适应INotifyPropertyChanged到你的控制,但它听起来有点怪,你的控制数据提供给其他系统的一部分。也许你需要创建一个包含数据的视图模型,然后你可以让你的控件数据绑定。

+0

我仍然在试图弄清为什么这种解决方案不适合我的情况。也许这在绑定模板时不起作用? – Aardvark 2009-10-04 22:46:31

0

如果我套用你给

如何得到通知问题,当依赖属性发生变化?

这是正确的吗?我从你的短语中“通常在.NET中,我会但是在属性的getter中的一些逻辑,但这些被逻辑XAML数据绑定绕过”。

如果我是正确的,那么你可以注册你自己的属性改变回调。它总是被称为。引起更改绑定,样式或触发器的人无关紧要。下面的代码片段从MSDN文章 “Dependency Property Callbacks and Validation” 采取:

public static readonly DependencyProperty CurrentReadingProperty = 

    DependencyProperty.Register(
     "CurrentReading", 
     typeof(double), 
     typeof(Gauge), 
     new FrameworkPropertyMetadata(
      Double.NaN, 
      FrameworkPropertyMetadataOptions.AffectsMeasure, 
      new PropertyChangedCallback(OnCurrentReadingChanged), 
      new CoerceValueCallback(CoerceCurrentReading) 
     ), 
     new ValidateValueCallback(IsValidReading) 
    ); 
    public double CurrentReading 
    { 
     get { return (double)GetValue(CurrentReadingProperty); } 
     set { SetValue(CurrentReadingProperty, value); } 
    } 

你这里的外卖是OnCurrentReadingChanged()方法。希望这可以帮助 :)。

+1

我敢肯定,问题是关于如何在对象中第一次访问 时“延迟加载”依赖项属性的值,而不是在依赖项属性发生更改时如何获得通知。 – 2009-09-23 16:21:10

+0

Martin说了什么...... – Aardvark 2009-09-23 17:07:54