我在尝试做某件事情时遇到了问题,应该像做一样简单。我试图使用基于DependencyProperty
或DataTrigger
的Trigger
- 我无法上班。WPF - 触发器没有触发
XAML的触发因素是:
<Style x:Key="FileWatchButton" BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="Main:Main.XmlFilesAvailableForLoading" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
和相关的代码隐藏是:
public static readonly DependencyProperty XmlFilesAvailableForLoadingProperty =
DependencyProperty.Register("XmlFilesAvailableForLoading", typeof(bool), typeof(Main));
public bool XmlFilesAvailableForLoading
{
get
{
try
{
return (bool)this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.DataBind,
(System.Windows.Threading.DispatcherOperationCallback)delegate { return GetValue(XmlFilesAvailableForLoadingProperty); },
XmlFilesAvailableForLoadingProperty);
}
catch (Exception)
{
return (bool)XmlFilesAvailableForLoadingProperty.DefaultMetadata.DefaultValue;
}
}
set
{
this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.DataBind,
(System.Threading.SendOrPostCallback)delegate{ SetValue(XmlFilesAvailableForLoadingProperty, value); }, value);
}
}
基本上DP是由主持人设置正确(它是基于一个FileSystemWatcher
类期待对于一个或多个文件),但Trigger
未被解雇。这是一个线程问题吗?
谢谢。
如果我在我的属性中有标准getter/setter,那么我会得到以下异常: “调用线程无法访问此对象,因为不同的线程拥有它。” I.e.我需要使用线程安全的getter/setter。 Main是我尝试通过触发器设置样式的按钮所在的窗口。我试过下面的DataTrigger,它对我来说似乎是语法正确的,但是没有做任何事情: P.该按钮没有Main属性,我试图在XmlFilesAvailable上触发。 –
pFrenchie
2009-10-30 01:21:02
您的DataTrigger在语法上是正确的,但会在本地数据上下文中查找XmlFilesAvailableForLoading属性。那是对的吗?从你的代码示例看起来像这个属性是在Main上。如果是这样,您可以使用ElementName(如示例绑定或RelativeSource AncestorType所示)来获取DataTrigger绑定,以查找正确位置(Main元素)上的属性。 – itowlson 2009-10-30 01:36:48
只需重申一下,Main是控制托管的窗口,而XmlFilesAvailableForLoading是窗口的公共属性 - 因此它应该是本地数据上下文。我尝试添加如示例代码中所示的ElementName,但无济于事(即编译和运行,但没有任何反应)。 – pFrenchie 2009-10-30 02:02:47