未调用颜色转换器绑定

时间:2019-10-16 18:46:18

标签: xamarin xamarin.forms

我在带有白色背景颜色的框架内有一个黑色文本标签,问题是,我想从viewmodel中分配背景颜色和文本颜色,我创建了转换器,并进行了绑定,但是对于由于某些原因而无法正常工作

这是我的查看代码:

?xml version="1.0" encoding="UTF-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="ComanderoMovil.Views.PlatillosView"
    xmlns:ios="clr -namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
    ios:Page.UseSafeArea="true"
    xmlns:behaviorsPack="clr- namespace:Xamarin.Forms.BehaviorsPack;assembly=Xamarin.Forms.Behaviors Pack"
    xmlns:converterPack="clr-namespace:ComanderoMovil.Converters">

    <ContentPage.Resources>
        <ResourceDictionary>
            <converterPack:ColorConverter x:Key="ColorConverter"/>
        </ResourceDictionary>
    </ContentPage.Resources>

    <ContentPage.Content>
        <StackLayout>
            <SearchBar> </SearchBar>
            <CollectionView ItemsSource="{Binding Grupos}"
                            HeightRequest="50"
                            ItemsLayout="HorizontalList"
                            SelectionMode="Single"
                            SelectionChangedCommand="{Binding 
SelectedGrupoCommand, Mode=TwoWay}">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <ContentView Padding="2">
                            <Frame BorderColor="Black"
                                   HasShadow="False"
                                   Padding="2"
                                   BackgroundColor="{Binding 
ButtonBackColor, Converter={StaticResource ColorConverter}}">
                                <StackLayout>
                                    <Label Margin="10"
                                           Text="{Binding nombre}"
                                           TextColor="{Binding 
TextColor, Converter = {StaticResource ColorConverter}}"

VerticalTextAlignment="Center"

 HorizontalTextAlignment="Center"
                                           FontSize="Small"

VerticalOptions="CenterAndExpand"></Label>
                                </StackLayout>
                            </Frame>
                         </ContentView>
                     </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
 </ContentPage.Content>
</ContentPage>

这是我的ViewModel:

public class PlatillosViewModel : INotifyPropertyChanged
{
    private INavigation Navigation;
    private ObservableCollection<PlatilloModel> _platillos;
    private string _textColor;
    private string _backColor;
    public event PropertyChangedEventHandler PropertyChanged;
    public ObservableCollection<GrupoModel> Grupos { get; set; }
    public ObservableCollection<PlatilloModel> Platillos
    {
        get => _platillos;
        set
        {
            _platillos = value;
            OnPropertyChanged();
        }
    }

    public string TextColor
    {
        get => _textColor;
        set
        {
            _textColor = value;
            OnPropertyChanged();
        }
    }

    public string ButtonBackColor
    {
        get => _backColor;
        set
        {
            _backColor = value;
            OnPropertyChanged();
        }
    }

    public PlatillosViewModel(INavigation navigation)
    {
        Navigation = navigation;
        TextColor = "Black";
        ButtonBackColor = "White";
        PlatillosRepository repository = new PlatillosRepository();
        Platillos = repository.GetAll();
        GrupoRepository grupoRepository = new GrupoRepository();
        Grupos = grupoRepository.GetAll();
    }

    public ICommand SelectedPlatilloCommand => new Command<PlatilloModel>(async platillo =>
    {
        await Navigation.PushAsync(new PlatilloView());
    });

    public ICommand SelectedGrupoCommand => new Command<GrupoModel>(async grupo =>
    {
        ButtonBackColor = "Black";
        TextColor = "White";
        PlatillosRepository platillosRepository = new PlatillosRepository();
        Platillos = platillosRepository.GetFilteredByGroup(grupo);
    });

    protected virtual void OnPropertyChanged([CallerMemberName] string property = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
    }
}

这是我的转换器:

public class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var valor = value.ToString();
        switch(valor)
        {
            case "White":
                return Color.White;
            case "Black":
                return Color.Black;
            default:
                return Color.Red;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

1 个答案:

答案 0 :(得分:2)

您的问题不在于ValueConverter,而是您的绑定。

<CollectionView ItemsSource="{Binding Grupos}"
                HeightRequest="50"
                ItemsLayout="HorizontalList"
                SelectionMode="Single"
                SelectionChangedCommand="{Binding SelectedGrupoCommand, Mode=TwoWay}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <ContentView Padding="2">
                <Frame BorderColor="Black"
                        HasShadow="False"
                        Padding="2"
                        BackgroundColor="{Binding ButtonBackColor, Converter={StaticResource ColorConverter}}">
                    <StackLayout>
                        <Label Margin="10"
                                Text="{Binding nombre}"
                                TextColor="{Binding TextColor, Converter = {StaticResource ColorConverter}}"
                                VerticalTextAlignment="Center"
                                HorizontalTextAlignment="Center"
                                FontSize="Small"
                                VerticalOptions="CenterAndExpand">
                        </Label>
                    </StackLayout>
                </Frame>
                </ContentView>
            </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

您正在使用CollectionView,并且在设置ItemSource时

<CollectionView ItemsSource="{Binding Grupos}"

您在内部进行的所有绑定都将其假设为BindingContext

<Label Margin="10"
        Text="{Binding nombre}"
        TextColor="{Binding TextColor, Converter = {StaticResource ColorConverter}}"
        VerticalTextAlignment="Center"
        HorizontalTextAlignment="Center"
        FontSize="Small"
        VerticalOptions="CenterAndExpand" />

与绑定到Label Text属性的 nombre 属性一样,它也是GroupModel类的一部分,即{{1 }}和TextColor属性应该是您与ItemSource绑定的同一类的一部分。

如果要使其起作用:将这两个属性(ButtonBackColorTextColor)添加到ButtonBackColor类中,或更改绑定,以便可以从父绑定。

第一个将为您提供更大的灵活性,但同时可能会添加重复的代码(例如,如果所有项目将共享相同的颜色)。

第二种方法可以通过以下方式完成:

GroupModel

添加名称
CollectionView

然后,我们将对那些不属于您的<CollectionView ItemsSource="{Binding Grupos}" HeightRequest="50" x:Name="GruposList" .... 但属于ViewModel的项的绑定进行一些更改

GrupoModel

如您所见,我们现在正在通过CollectionView绑定访问它们,我们在指定Source并使用<DataTemplate> <ContentView Padding="2"> <Frame BorderColor="Black" HasShadow="False" Padding="2" BackgroundColor="{Binding BindingContext.ButtonBackColor, Source={x:Reference GruposList}, Converter={StaticResource ColorConverter}}"> <StackLayout> <Label Margin="10" Text="{Binding nombre}" TextColor="{Binding BindingContext.TextColor, Source={x:Reference GruposList}, Converter={StaticResource ColorConverter}}" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" FontSize="Small" VerticalOptions="CenterAndExpand"> </Label> </StackLayout> </Frame> </ContentView> </DataTemplate> 时执行此操作。有关绑定here

的更多信息

希望这会有所帮助。-

旁注:

在转换器中观察 null

Reference

如果 value 为空,以上内容会使您的应用程序崩溃。

改为使用此:

var valor = value.ToString();