2011-04-15 40 views
1

有WPF中一个特殊的情况下,我需要通过实际没有得到存储本身,而是用来设置其他依赖属性XAML来设置依赖项属性。这很简单,因为我只是使用CoerceValue来拦截更改,按照传入的值执行所需操作,然后取消该属性的更改。这意味着当我获得该属性时,我将仍然得到默认值,因为我阻止了实际更改。很棒。作为一个例子,当我设置这个假的CanvasRect =“10,10,40,20”DP时,它在内部实际上设置了Canvas.Left,Canvas.Top,Width和Height DP,而CanvasRect本身仍然保留在它的默认为“0,0,0,0”。在WPF中,一个DP,有没有办法用一个函数返回默认值或对吸气侧的CoerceValue?

不过,我有一个想法,如果我是不是读的财产,我愿意再水化该值基础上与其他依赖属性。这可以用一个简单的单行函数来完成...

return new rect(Canvas.GetLeft(this), Canvas.GetTop(this), Width, Height); 

把它看成是一个排序的CoerceValue但在吸气侧,而不是制定者。但是,我不确定如何,或者即使您可以使用函数来强制这样的回读值。

注:是的,我知道这个方法就失效了CanvasRect DP的任何变更通知 但是我没有 照顾,我也不真正想要的。如果 我这样做,我会代替存储实际 矩形,然后通过 订阅属性保持同步变化的Canvas.Left,Canvas.Top的 事件, 宽度和高度的DPS,这 功能将使我 想要什么,但这是一个比实际DP更方便的事情。 加上这是一个非常简单的例子,以显示我在问什么。 真实世界的例子可以是基于时间,例如在没有DP 更改通知会怎样都无所谓 。

现在我知道我也可以简单地实现我在吸气的.NET包装财产想要的,而是通过绑定和读取时如此,.NET属性包装被绕过这就是为什么MSDN说要除了便利的授权DP之外,不要将其用于任何其他用途。此外,对于OneTime以外的其他任何事情,无论如何,这还是没有意义,不会发生更改通知。

无论如何,正如我所说的,DP setter的工作原理非常棒,但是如果我确实想要放入getter,我不确定我能想出其他任何方式,除了将相关的所有更改通知DPS。

存储的,为什么你会想这样做,是因为你想使用的值转换为属性的getter本身的返回值,也许是为了保持在一定范围内的返回值,但不会失去实际的另一个例子其他内部目的的价值。

但是,回到基本的问题在这里:有没有办法用一个函数作为一个DP的默认值,或在吸气侧至少CoerceValue?

回答

2

价值强制只适用于改变DP的有效值。它不适用于读取DP值。您可以创建另一个分配了CanvasRect值的DP(如CachedCanvasRect),并在CanvasRect更改值时更新缓存的DP。

+0

如果我这样做,为什么还要使用第二个DP作为缓存值呢?我只是将缓存的rect存储在CanvasRect DP本身中。另外,其他事情(其他DP,时间,任何)都可以改变缓存值,所以它不仅仅在CanvasRect的setter上。总之,我认为你不能以这种方式使用DP。反正看起来不像。 – MarqueIV 2011-04-15 17:48:40

相关问题