2013-12-12 66 views
2

我想通過附加屬性使用來自Thomas Levesque的技巧爲DataGridTextColumn創建參數化樣式。但是,我無法爲我的案子工作。WPF:這個DataGridTextColumn風格有什麼問題?

基本上,我想這

    <DataGridTextColumn Header="Today Chg $" Binding="{Binding TodaysValueChange, StringFormat=N2}" IsReadOnly="True"> 
         <DataGridTextColumn.CellStyle> 
          <Style TargetType="DataGridCell" BasedOn="{StaticResource RightAlignedCellStyle}"> 
           <Setter Property="Foreground" Value="{Binding Path=TodaysValueChange, Converter={StaticResource PriceChangeToColor}}"/> 
          </Style> 
         </DataGridTextColumn.CellStyle> 
        </DataGridTextColumn> 

轉換成該

    <DataGridTextColumn Header="Today Chg $" Binding="{Binding TodaysValueChange, StringFormat=N2}" IsReadOnly="True" CellStyle="{StaticResource ColoredCell}" ul:ThemeProperties.SignValue="{Binding TodaysValueChange}" ElementStyle="{StaticResource CellRightAlign}"/> 

不過,我得到這個錯誤: 「A不能一 'DataGridTextColumn' 集合中使用的 '綁定' 。綁定只能在DependencyObject的的一個DependencyProperty設置「爲結合TodaysValueChange到UL:ThemeProperties.SignValue。」我不知道它是什麼抱怨

這是我ThemeProperties:

public static class ThemeProperties 
{ 
    public static double GetSignValue(DependencyObject obj) 
    { 
     return (double)obj.GetValue(SignValueProperty); 
    } 

    public static void SetSignValue(DependencyObject obj, double value) 
    { 
     obj.SetValue(SignValueProperty, value); 
    } 

    public static readonly DependencyProperty SignValueProperty = DependencyProperty.RegisterAttached("SignValue", typeof(double), typeof(ThemeProperties), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits)); 
} 

這是App.xaml中我的風格資源:

<Style x:Key="ColoredCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
     <Setter Property="Foreground" Value="{Binding Path=ul:ThemeProperties.SignValue, Converter={StaticResource PriceChangeToColor}}"/> 
    </Style> 

回答

1

我無法重現您確切的問題(我沒有看到你所提到的錯誤),但我可以看到幾個問題:

  • DataGrid列不是視覺或邏輯樹的一部分,所以它們不會繼承DataContext。正因爲如此,SignValue屬性的綁定沒有任何約束。
  • 即使列繼承了DataContext,它仍然是行不通的,因爲該列是「全球性」的DataGrid,因此它會得到DataGridDataContext,而不是DataContext特定行。
  • 當您在ColoredCell樣式中設置裝訂時,它與當前單元的DataContext(它是數據項並且沒有SignValue屬性集)相對。您需要相對於單元格本身進行綁定(RelativeSource=Self)。但由於上述的其他問題,就不能工作...

不幸的是,我不認爲有一個簡單的方法在這種情況下,我的「參數化風格」招工作,因爲東西需要樣式中的變化是綁定路徑,並且沒有辦法「綁定綁定的路徑」。所以我認爲你應該堅持你的初始解決方案(這不是那麼糟糕的IMO)。