c# - Winrt,根据绑定(bind)值改变颜色

标签 c# xaml data-binding windows-runtime windows-store-apps

我有一个看起来像这样的 GridView :

<GridView ItemContainerStyle="{StaticResource GridViewItemStyle2}" ItemsSource="{Binding MyMeetingsSquareUsers}" Grid.Row="1" Margin="10,10,10,0"  SelectionMode="None" HorizontalContentAlignment="Left" VerticalContentAlignment="Bottom">
    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid Orientation="Vertical" MaximumRowsOrColumns="1"/>
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>
    <GridView.ItemTemplate>
        <DataTemplate>
            <Grid Height="35" Width="35" Margin="0,0,10,0" >
                <Border BorderBrush="red" BorderThickness="1" CornerRadius="15">
                    <Ellipse>
                        <Ellipse.Fill>
                            <ImageBrush Stretch="Fill" ImageSource="ms-appx:///Images/photo_empty.png"/>
                        </Ellipse.Fill>
                    </Ellipse>
                </Border>
            </Grid>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

我使用的ItemsSource是这种类型的项目列表:

public class MeetingInvitee
{
    public string id { get; set; }
    public string status { get; set; }
    public User user { get; set; }
    public BitmapImage photo { get; set; }
}

我想知道的是,是否可以根据状态中的值更改我使用的边框的颜色

例如,如果我有 3 种可能的状态:已接受已拒绝待定,则颜色将设置为绿色、红色或相应地为黄色。

因此,如果列表中的其中一项的状态为“已拒绝”,则边框将带有红色画笔

最佳答案

条件模板(不幸的是,而不是样式数据触发器)是商店应用程序中的使用方式。您需要做的是为每种颜色定义三个不同的模板,并在后面的代码中创建一个模板选择器。

数据模板选择器

   public class MeetingTemplateSelector : DataTemplateSelector
    {
        public DataTemplate AcceptedTemplate { get; set; }

        public DataTemplate RejectedTemplate { get; set; }

        public DataTemplate PendingTemplate { get; set; }

        protected override DataTemplate SelectTemplateCore(object item, 
                  DependencyObject container)
        {
           DataTemplate result;

           switch( ((MeetingInvitee) item).Status)
           {
                case "Accepted" : result = AcceptedTemplate; break;
                case "Rejected" : result = RejectedTemplate; break;
                case "Pending"  : result = PendingTemplate; break;
           }

          return result;
        }
    }

在资源中声明模板

<UserControl.Resources>
    <DataTemplate x:Key="AcceptedTemplate">
        <Border Background="Green">
             ...
        </Border>
    </DataTemplate>
    <DataTemplate x:Key="RejectedTemplate">
        <Border Background="Red">
             ...
        </Border>
    </DataTemplate>
    <DataTemplate x:Key="PendingTemplate">
        <Border Background="Yellow">
             ...
        </Border>
    </DataTemplate>

    <local:MeetingTemplateSelector x:Key="meetingSelector"
                                    AcceptedTemplate="{StaticResource AcceptedTemplate}"
                                    RejectedTemplate="{StaticResource RejectedTemplate}"
                                    PendingTemplate="{StaticResource PendingTemplate}">
    </local:MeetingTemplateSelector >
</UserControl.Resources>

使用

<GridView ItemContainerStyle="{StaticResource GridViewItemStyle2}" 
          ItemsSource="{Binding MyMeetingsSquareUsers}" 
          ItemTemplateSelector="{StaticResource meetingSelector}">

关于c# - Winrt,根据绑定(bind)值改变颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31596617/

相关文章:

c# - 我怎样才能退回斐波那契数列?我应该使用 IList<> 吗?

c# - 为什么我不能有 "public static const string S = "东西”;在我的类(class)?

c# - 如何仅获取xaml列表中的第一项

c# - 将 RadioButton XAML 定位在内容的中心底部

asp.net - 为什么不能在 ListView 中使用 <%=...%>

css - 使用函数 knockout CSS 数据绑定(bind)?

java - 如何在 Eclipse RCP 应用程序 (SWT) 中绑定(bind)组合的 selectionIndex 和 Integer?

c# - 我加入 .NetCore 3.1 引发有关 NavigationExpandingExpressionVisitor 的异常,那是什么?

c# - 使用 Fluent API 在 C# 中创建 Blob 存储容器

c# - 将数据从代码隐藏到 XAML 的简单绑定(bind)