0

我想调用在后面的代码中传递的 Setter(特定于 WPF)。

void Invoke(Setter setter)
{
   //I am interested what to do here, ?
}

设置器将类似于

<Setter TargetName="SomeUiElement" Property="SomeProperty" Value="{Binding SomeValue}" />

//resolution similar to
void Call(Setter setter)
{
   setter.Property.SetValue(setter.TargetObject, setter.Value.GetValue())
}

提前致谢。请具体。

4

1 回答 1

6

二传手并不像他们看起来的那样。当 WPF 激活它们时,它们不会严格设置属性的值(尽管有名称)。相反,它们贡献了一个可能的价值,这可能会或可能不会对财产的有效价值产生影响。(这取决于更高优先级的属性值源当前是否处于活动状态。http: //msdn.microsoft.com/en-us/library/ms743230.aspx记录了属性值可以来自 11 个不同的位置。)当设置器停用时,他们不再提供这种价值。

我提到这一点的原因是为了解释为什么从来没有真正“调用”过 setter。调用是即时的——它是在特定时刻发生的事情。另一方面,Setter 会在一段时间内处于活动状态。(所以有两个有趣的时刻:它们变得活跃的点,以及它们停止活跃的点。)

因此,如果您询问如何调用 setter,您可能没有合适的工具来完成您尝试做的任何工作。可能发生的最接近的情况是 setter 变得活跃,并且无论您希望它多长时间都保持活跃。

此外,setter 的激活并不能保证它的 target 属性会真正改变,因为可能还有其他更高优先级的值源。此外,为了清楚激活应该意味着什么,您需要知道 setter 的使用方式 - 默认样式中的 setter 的优先级低于应用程序定义的样式中的优先级,而后者反过来具有低于模板中触发器激活的设置器的优先级...

因此,孤立的 setter 是没有意义的,因为它的行为(即当它变得活跃时会做什么)是由 setter 出现的上下文定义的。

现在从您的代码来看,您真正想要做的似乎是将设置器目标的本地值设置为属性将获取的任何值,如果 a)设置器变为活动状态并且 b)设置器是最高优先级该属性可用的值。但这并不是一个二传手实际上知道该怎么做的事情。

是的,这很讽刺,但设置者实际上并不知道如何设置属性。

导致 setter 的值成为目标属性值的代码实际上分布在 WPF 的各个部分(包括TriggerStyle类等)。没有一种直接的方法可以让 WPF 做你想做的事,因为它没有一种孤立的方法 - WPF 自己的 setter 处理与属性系统的许多其他方面混合在一起。我强烈建议您尝试寻找其他方法来解决您希望以这种方式解决的任何问题。

于 2013-02-25T16:03:38.687 回答