2014-07-06 40 views
1

如何根據單個項目的屬性設置單個網格項目的背景顏色?我有以下代碼:基於項目屬性的網格背景顏色

<PivotItem x:Uid="PivotBlocks" Margin="10, 10, 10, 10" Header="blockx" DataContext="{Binding Blocks}" d:DataContext="{Binding , Source={d:DesignData Source=/DataModel/SampleData.json, Type=data:DataSource}}"> 
    <GridView ItemsSource="{Binding Formations}" IsItemClickEnabled="True" ItemClick="Point_ItemClick" Loaded="PivotBlocks_Loaded" ContinuumNavigationTransitionInfo.ExitElementContainer="True"> 
     <GridView.ItemTemplate> 
      <DataTemplate> 
       <Grid Width="80" Height="80" Margin="0,0,10,10" Background="{StaticResource PhoneAccentBrush}"> 
        <StackPanel VerticalAlignment="Bottom"> 
         <TextBlock Text="{Binding Shorthand}" Padding="5, 0, 0, 5" Style="{StaticResource SubheaderTextBlockStyle}" /> 
        </StackPanel> 
       </Grid> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
</PivotItem> 

每個組(項目)有Bool,我要用來設置顏色,所以灰色如果屬實類型的HasBeenSelected財產,否則用戶強調色。

+1

你看過DataTrigger嗎? http://stackoverflow.com/questions/20099694/listbox-item-wpf-different-background-color-for-different-items –

+0

Windows Phone 8.1不支持觸發器 – blawford

回答

1

比如,你可以使用轉換此任務:

定義命名空間中的一個轉換器類:

namespace MyConverters 
{ 
    public class BoolToBrush : IValueConverter 
    { 
    private Brush FalseValue = new SolidColorBrush(Colors.Gray); 
    public Brush TrueValue = Application.Current.Resources["PhoneAccentBrush"] as Brush; 

    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (value == null) return FalseValue; 
     else return (bool)value ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return value != null ? value.Equals(TrueValue) : false; 
    } 
    } 
} 
在XAML

然後在Page.Resources定義鍵(不要忘了添加命名空間):

<Page ... 
     ... some code ... 
xmlns:converter="MyConverters" 
     .../> 
<Page.Resources> 
    <converter:BoolToBrush x:Key="BoolToBrush"/> 
</Page.Resources> 

然後終於可以使用你的con轉換器與綁定:

<PivotItem x:Uid="PivotBlocks" Margin="10, 10, 10, 10" Header="blockx" DataContext="{Binding Blocks}" d:DataContext="{Binding , Source={d:DesignData Source=/DataModel/SampleData.json, Type=data:DataSource}}"> 
    <GridView ItemsSource="{Binding Formations}" IsItemClickEnabled="True" ItemClick="Point_ItemClick" Loaded="PivotBlocks_Loaded" ContinuumNavigationTransitionInfo.ExitElementContainer="True"> 
     <GridView.ItemTemplate> 
      <DataTemplate> 
       <Grid Width="80" Height="80" Margin="0,0,10,10" Background="{Binding HasBeenSelected, Converter={StaticResource BoolToBrush}}"> 
        <StackPanel VerticalAlignment="Bottom"> 
         <TextBlock Text="{Binding Shorthand}" Padding="5, 0, 0, 5" Style="{StaticResource SubheaderTextBlockStyle}" /> 
        </StackPanel> 
       </Grid> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
</PivotItem> 
+0

爲什麼不DataTrigger? – RoninCoder

+2

@BenJ因爲它不是WPF。 WP8.1中的AFAIK觸發器不可用[參考一](http://social.msdn.microsoft.com/Forums/windowsapps/en-US/380b4b7b-72e2-4435-b7f7-0d2afca4eac0/winrt-cxaml-limitations? forum = winappswithcsharp),[two](http://stackoverflow.com/q/14732723/2681948)。這也可以通過* VisualStates *完成,但是* Converter *也應該正常工作 - 這是可能的解決方案之一。 – Romasz

+0

對不起,我們爲什麼要在這裏創建一個新的命名空間? – blawford