繁体   English   中英

DataTemplate OnSelectTemplate 不工作 Xamarin.Forms

[英]DataTemplate OnSelectTemplate Not Working Xamarin.Forms

我有一个 CollectionView,里面有 1 个框架,框架的背景颜色会根据从数据库的每个对象收集字符串数据的变量“GetColor”的字符串值而改变,但框架的背景颜色保持为“红色”每时每刻。

#CollectionView

  <CollectionView Margin="5" ItemsSource="{Binding ListGroupData}"  
  ItemsUpdatingScrollMode="KeepLastItemInView" ItemTemplate="{StaticResource 
  GroupDataTemplateSelector}" VerticalOptions="FillAndExpand" 
  HorizontalOptions="FillAndExpand"/>

  <ResourceDictionary>
        <DataTemplate x:Key="RedTemplate">
            <StackLayout>

                <Frame HasShadow="False" Padding="10" HorizontalOptions="StartAndExpand" 
                BackgroundColor="Red" 
                CornerRadius="15">
                    <Label Text="{Binding Name}" TextColor="Black"/>
                </Frame>

            </StackLayout>
        </DataTemplate>

        <DataTemplate x:Key="GreenTemplate">
            <StackLayout>

                <Frame HasShadow="False" Padding="10" HorizontalOptions="EndAndExpand" 
                BackgroundColor="Green" 
                CornerRadius="15">
                    <Label Text="{Binding Name}" TextColor="Black"/>
                </Frame>

            </StackLayout>
        </DataTemplate>
        <Local:GroupDataViewModel x:Key="GroupDataTemplateSelector" RedTemplate=" 
    {StaticResource 
    RedTemplate}" GreenTemplate="{StaticResource GreenTemplate}"/>
 </ResourceDictionary>

#TemplateSelector 代码

 protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        if (GetColor == "Red")
            return RedTemplate;
        else
            return GreenTemplate;
    }
 public DataTemplate RedTemplate { get; set; }
 public DataTemplate GreenTemplate { get; set; }

#公共变量

 public string GetColor;
 public ObservableCollection<GroupData> ListGroupData = new ObservableCollection<GroupData>();

#支持的代码

 FirebaseClient fc = new FirebaseClient("...");
 var result = await fc.Child("GroupData").OnceAsync<GroupData>();
 foreach (var item in result)
 {
   GetColor = item.Object.Color;
   ListGroupData.Add(item.Object);
 }
 ///this part the item that is being added to the ListGroupData(CollectionView) suppose to 
 have different backgroundcolor bases on its data

您不需要公共属性GetColor 因为该属性会针对集合中的每个对象进行评估,而不是在视图模型中。

您将需要修改您的模板选择器

 protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        //Your list is a list of GroupData. then you will need to cast item to the type of your object
        var targetColor =  (GroupData)item.Color;
        if (targetColor == "Red") //this if the item.Color is String
            return RedTemplate;
        else
            return GreenTemplate;
    }

PD:

或者,如果您的item.Color是 Color 类型,您可以在CollectionView.ItemTemplate使用它来为您的 Frame.You 着色。您只需要向该属性添加一个绑定。 (并且您可以删除所有 TemplateSelector 代码)

如果您的item.Color不是 Color 类型,则必须添加一个转换器(您必须对其进行编码),以将值转换为颜色。

            <CollectionView Margin="5" 
                            ItemsSource="{Binding ListGroupData}"  
                            ItemsUpdatingScrollMode="KeepLastItemInView" 
                            VerticalOptions="FillAndExpand" 
                            HorizontalOptions="FillAndExpand">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout>
                            <Frame HasShadow="False" 
                                   Padding="10" 
                                   HorizontalOptions="EndAndExpand" 
                                   BackgroundColor="{Binding Color}" 
                                   CornerRadius="15">
                                <Label Text="{Binding Name}" TextColor="Black"/>
                            </Frame>
                        </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

快乐编码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM