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变量

 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

您不需要 public 属性 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 是颜色类型,您可以在 CollectionView.ItemTemplate 中使用它来为您的 Frame.You 着色,只需添加绑定到 属性. (并且你可以删除所有的TemplateSelector代码)

如果您的 item.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>