2010-11-17 57 views
0

所以,我有一些控件的窗口。在資源部分,我定義這個風格:爲什麼這個DataTrigger改變基於祖先附屬屬性的元素樣式不起作用?

<Style x:Key="StyleNavBar" TargetType="{x:Type Grid}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding CurrentTheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"> 
      <DataTrigger.Value> 
       <theme:WinTheme>WindowsClassic</theme:WinTheme> 
      </DataTrigger.Value> 
      <Setter Property="Background" Value="#FFFFFFFF" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

在我的窗口,我定義了一個名爲哪些商店(基於ENUM)當前主題使用的系統範圍內的「CurrentTheme」附加屬性。下面的代碼:

public static readonly DependencyProperty CurrentSystemThemeProperty = 
    DependencyProperty.RegisterAttached(
     "CurrentSystemTheme", 
     typeof(WinTheme), 
     typeof(MainWindow), 
     new UIPropertyMetadata(WinTheme.AeroGlass)); 

public WinTheme CurrentTheme 
{ 
    get 
    { 
     return (WinTheme)GetValue(CurrentSystemThemeProperty); 
    } 
    set 
    { 
     SetValue(CurrentSystemThemeProperty, value); 
    } 
} 

每當用戶改變系統主題,我通過窗口的WndProc收到回調,通知該主題已經改變。而且,如您所見,CurrentTheme屬性的默認值是WinTheme.AeroGlass。然後我在上面定義的樣式風格的網格:

<Grid Height="34" Name="grdNavBar" VerticalAlignment="Top" Style="{DynamicResource StyleNavBar}"> 

我的目標是改變基於CurrentTheme價值的風格,但上述定義的觸發時主題更改(只與工作不工作CurrentTheme的默認值,即不對屬性的變化作出反應)。

有關如何完成此任何想法?

回答

1

您已通過與您在C#中給出該屬性的名稱不同的名稱DependencyProperty.RegisterAttached。所以DP系統認爲它叫做CurrentSystemTheme,但你的代碼認爲它叫做CurrentTheme。嘗試傳遞CurrentTheme作爲RegisterAttached的第一個參數。另外,您可能希望啓用WPF調試日誌輸出以進行數據綁定(默認情況下,在較早版本的WPF中,但在.NET 4/VS 2010中,您需要在Tools中將其打開 - >調試 - >輸出窗口下的選項窗口)。這樣,我通常將WPF跟蹤設置 - >數據綁定選項設置爲全部。這樣,如果數據綁定失敗,您將在「輸出」窗口中看到錯誤。這可能有助於您診斷數據觸發器失敗的原因。

+0

謝謝,伊恩。多麼愚蠢的錯誤:)。它現在有效。並感謝提示。 – EdMelo 2010-11-17 01:22:44

相關問題