2009-10-29 145 views
1

我在尝试做某件事情时遇到了问题,应该像做一样简单。我试图使用基于DependencyPropertyDataTriggerTrigger - 我无法上班。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未被解雇。这是一个线程问题吗?

谢谢。

回答

1

不清楚代码是否完整,但看起来像触发器中的属性路径可能是错误的。正在设计的按钮是否具有主属性?我猜不是;它看起来像你试图触发一个名为Main的不同元素的属性 - 是吗?

在任何情况下,命名空间前缀都不是必需的。如果该按钮具有名为Main的属性,则可以直接解决此问题;如果没有,那么前缀不会帮助你。

我的猜测是,你可能需要一个DataTrigger,它的绑定是指主要元素:

<local:Main Name="MyMain" ... /> <!-- this has the XmlFilesAvailableForLoading property --> 

<DataTrigger Binding="{Binding XmlFilesAvailableForLoading, ElementName=MyMain}" 
      Value=True> 
    <Setter Property="Background" Value="Red" /> 
</DataTrigger> 

在一个不相关的注意事项,如果您有任何非样板实施的DP getter和setter。请记住,绑定和样式系统将绕过getter和setter并直接与底层存储交谈。所以我强烈建议将它们改回原来的GetValue和SetValue调用。

+0

如果我在我的属性中有标准getter/setter,那么我会得到以下异常: “调用线程无法访问此对象,因为不同的线程拥有它。” I.e.我需要使用线程安全的getter/setter。 Main是我尝试通过触发器设置样式的按钮所在的窗口。我试过下面的DataTrigger,它对我来说似乎是语法正确的,但是没有做任何事情: P.该按钮没有Main属性,我试图在XmlFilesAvailable上触发。 – pFrenchie 2009-10-30 01:21:02

+0

您的DataTrigger在语法上是正确的,但会在本地数据上下文中查找XmlFilesAvailableForLoading属性。那是对的吗?从你的代码示例看起来像这个属性是在Main上。如果是这样,您可以使用ElementName(如示例绑定或RelativeSource AncestorType所示)来获取DataTrigger绑定,以查找正确位置(Main元素)上的属性。 – itowlson 2009-10-30 01:36:48

+0

只需重申一下,Main是控制托管的窗口,而XmlFilesAvailableForLoading是窗口的公共属性 - 因此它应该是本地数据上下文。我尝试添加如示例代码中所示的ElementName,但无济于事(即编译和运行,但没有任何反应)。 – pFrenchie 2009-10-30 02:02:47