手动调用WPF Setter

时间:2013-02-25 14:37:09

标签: wpf xaml setter

我想在后面的代码中调用一个Setter(WPF特定的)。

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

setter将类似于

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

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

提前致谢。请具体说明。

1 个答案:

答案 0 :(得分:6)

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

我提到这个的原因是为了解释为什么setter永远不会被“调用”。调用是即时的 - 这是在特定时刻发生的事情。另一方面,Setter在一段时间内处于活动状态。 (所以有两个有趣的时刻:它们变得活跃的时刻,以及它们不再活跃的时刻。)

因此,如果您正在询问如何调用setter,那么您可能没有合适的工具来完成您正在尝试的任何工作。最接近的可能是setter变为活动状态,并且无论你想要多长时间都保持活动状态。

此外,激活setter并不能保证其目标属性实际会发生变化,因为可能存在其他更高优先级的值源。此外,为了清楚甚至激活应该是什么意思,你需要知道使用setter的方式 - 默认样式中的setter比应用程序定义的样式具有更低的预定义,而后者又是优先级低于模板中触发器激活的设置器...

因此,隔离的setter是没有意义的,因为它的行为(即它变为活动时的行为)是由setter出现的上下文定义的。

现在从您的代码中,您真正想要做的是安排将setter的目标的Local Value设置为属性将获得的任何值,如果a)setter变为活动状态并且b)setter是该属性可用的最高优先级值。但这并不是制定者真正知道如何做的事情。

是的,这很具有讽刺意味,但是制定者实际上并不知道如何设置属性。

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