2014-07-06 3 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> 

Каждая свита (элемент) имеет HasBeenSelected свойство типа Bool, что я хочу использовать, чтобы установить цвет, так что серый, если оно истинно, в противном случае цвет пользователи акцент.

+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 verter with Binding:

<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. AFAIK в WP8.1 Триггеры недоступны [ссылка одна] (http://social.msdn.microsoft.com/Forums/windowsapps/en-US/380b4b7b-72e2-4435-b7f7-0d2afca4eac0/winrt-cxaml-limitations? forum = winappswithcsharp), [два] (http://stackoverflow.com/q/14732723/2681948). Это также можно сделать с помощью * VisualStates *, но * Converter * также должен работать нормально - это одно из возможных решений. – Romasz

+0

Извините за задержку, но зачем создавать здесь новое пространство имен? – blawford

Смежные вопросы