我在嘗試做某件事情時遇到了問題,應該像做一樣簡單。我試圖使用基於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