2009-10-29 150 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