手动调用WPF Setter

手动调用WPF Setter,wpf,xaml,setter,Wpf,Xaml,Setter,我想调用传入代码隐藏的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 sett

我想调用传入代码隐藏的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())
}

//分辨率类似于
无效调用(Setter Setter)
{
setter.Property.SetValue(setter.TargetObject,setter.Value.GetValue())
}

提前谢谢。请具体一点。

设定者并不像他们看起来的那样。当WPF激活它们时,它们不会严格设置属性的值(不管名称如何)。相反,它们贡献了一种可能的价值,这种价值可能会也可能不会对财产的有效价值产生影响。(这取决于更高优先级的属性值源当前是否处于活动状态。文档属性值可以来自11个不同的位置。)当setter停用时,它们不再提供该值

我提到这一点的原因是为了解释为什么setter从未真正被“调用”。调用是即时的——它是在特定时刻发生的事情。另一方面,设置器在一段时间内处于活动状态。(因此有两个有趣的时刻:它们开始活动的时刻和它们停止活动的时刻。)

因此,如果您询问如何调用setter,您可能没有合适的工具来完成您要做的任何工作。可能发生的最接近的情况是setter变为活动状态,并在您希望的时间内保持活动状态

此外,setter的激活并不保证其目标属性会发生实际更改,因为可能存在其他更高优先级的值源。此外,为了弄清楚激活应该意味着什么,您需要知道setter的使用方式-默认样式中的setter比应用程序定义的样式中的setter具有更低的优先权,而应用程序定义的样式中的setter又比模板中的触发器激活的setter具有更低的优先级

因此,一个单独的setter是没有意义的,因为它的行为(即,当它变为活动状态时它所做的事情)是由setter出现的上下文定义的

现在从您的代码来看,您真正想要做的是将setter的目标的本地值设置为属性将获得的任何值,前提是a)setter处于活动状态,b)setter是该属性可用的最高优先级值。但这并不是一个二传手真正知道的事情

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


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

二传手并不像看上去那样。当WPF激活它们时,它们不会严格设置属性的值(不管名称如何)。相反,它们贡献了一种可能的价值,这种价值可能会也可能不会对财产的有效价值产生影响。(这取决于更高优先级的属性值源当前是否处于活动状态。文档属性值可以来自11个不同的位置。)当setter停用时,它们不再提供该值

我提到这一点的原因是为了解释为什么setter从未真正被“调用”。调用是即时的——它是在特定时刻发生的事情。另一方面,设置器在一段时间内处于活动状态。(因此有两个有趣的时刻:它们开始活动的时刻和它们停止活动的时刻。)

因此,如果您询问如何调用setter,您可能没有合适的工具来完成您要做的任何工作。可能发生的最接近的情况是setter变为活动状态,并在您希望的时间内保持活动状态

此外,setter的激活并不保证其目标属性会发生实际更改,因为可能存在其他更高优先级的值源。此外,为了弄清楚激活应该意味着什么,您需要知道setter的使用方式-默认样式中的setter比应用程序定义的样式中的setter具有更低的优先权,而应用程序定义的样式中的setter又比模板中的触发器激活的setter具有更低的优先级

因此,一个单独的setter是没有意义的,因为它的行为(即,当它变为活动状态时它所做的事情)是由setter出现的上下文定义的

现在从您的代码来看,您真正想要做的是将setter的目标的本地值设置为属性将获得的任何值,前提是a)setter处于活动状态,b)setter是该属性可用的最高优先级值。但这并不是一个二传手真正知道的事情

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


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

您不能只使用
SomeUiElement.SomeProperty=someobject.SomeValue?(或者如果您想使用绑定进行设置,请使用找到的语法)Setter Setter参数更全面,不仅您不能只使用
SomeUiElement.SomeProperty=someobject.SomeValue?(或者如果要将其设置为