2013-02-25 82 views
0

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

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()) 
} 

感谢。请具体说明。

+0

难道你不能只使用'SomeUiElement.SomeProperty = someobject.SomeValue;'? (或者如果你想用一个绑定来设置它,请使用找到的语法[here](http://stackoverflow.com/a/10131803/302677)) – Rachel 2013-02-25 14:47:34

+0

Setter setter参数不仅仅是 algorytmus 2013-02-25 14:52:06

回答

6

安装人员看起来不太像。当WPF激活它们时,它们不会严格设置属性值(尽管名称)。相反,他们提供了一个可能的价值,这可能会或可能不会影响该房产的有效价值。 (这取决于是否有更高优先级的属性值源当前处于活动状态http://msdn.microsoft.com/en-us/library/ms743230.aspx文档可能来自11个不同的地方属性值。)当设置者停用时,他们不再提供该值。

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

所以如果你问如何调用setter,你可能没有正确的工具,无论你想要做什么工作。可能发生的最接近的情况是,setter变为活动状态,并且保持活动状态的时间长达您想要的时间。

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

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

现在从你的代码看来,你真正想要做的就是将setter的目标的Local Value设置为属性获得的任何值,如果a)setter变为活动状态,b)该setter是该物业可用的最高优先价值。但这不是一个制定者真正知道如何去做的事情。

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

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

+0

如果我知道AssociatedObject会有帮助吗? – algorytmus 2013-02-25 16:35:31

+0

根据可用的信息很难说 - 你试图解决的根本问题是什么?(我猜你没有最终用户要求你调用Setter。:)) – 2013-02-25 16:49:32

+0

在一个模板控件中我有一个边框,我将其附加到“FocusManager.FocusedItem”上。然后,我在边界交互中使用EventTrigger,在该交互中我使用Setter作为依赖属性定义了一个SetPropertyAction(类似于PropertyChangeAction)。 Setter附加应该被激活,因为setter嵌套在边框的样式中。这样做时,我可以访问关联的对象,即边框。我对任何解决方案感兴趣,以激活安装人员,希望我很幸运,我的情况下启动安装程序。谢谢 – algorytmus 2013-02-25 22:09:35