Могу ли я использовать Xamarin Forms ListView с TemplateSelector и ValueConverter внутри шаблона? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть Xamarin ListView, который показывает элементы, основанные на различных шаблонах данных, который работает отлично! Я могу использовать Binding, как и ожидалось, в определениях Template. Но когда я пытаюсь использовать ValueConverter внутри шаблона, он никогда не вызывается (конвертер работает в других местах моего приложения).

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Итак, наконец-то я смог заставить все работать!

Моя проблема здесь заключалась в том, что я реализовал INotifyPropertyChanged в моей ViewModel, но не реализовал его для самих ViewItems. Поэтому, хотя мои ViewItems никогда не меняются, как показано в ListView-Template, кажется, что необходимо реализовать INotifyPropertyChanged хотя бы для свойств, которые я хочу использовать с ValueConverter.

Кстати, используя ValueConverter с теми же ViewItems без INotifyPropertyChanged НО без TemplateSelector (то есть как ListView-HeaderTemplate), все работает как ожидалось (по крайней мере, я ожидаю)

0 голосов
/ 15 апреля 2020

Я тестирую демо около ListView с T emplateSelector и ValueConverter внутри шаблона.

У меня есть два DataTemplates, чтобы проверить значение DateOfBirth.Year, если год закончился 1980 Если год закончился, 1980, просмотр списка будет установлен ValidTemplate, если нет, просмотр списка будет установлен InvalidTemplate.

    public class PersonDataTemplateSelector : DataTemplateSelector
    {
        public DataTemplate ValidTemplate { get; set; }

        public DataTemplate InvalidTemplate { get; set; }

        protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
        {
            return ((Person)item).DateOfBirth.Year >= 1980 ? ValidTemplate : InvalidTemplate;
        }
    }

В локации он будет иметь значение 0 или 1, тогда я преобразует его в Истину или Ложь с помощью следующего кода.

    public class MyValueConvert : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (int)value != 0;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (bool)value ? 1 : 0;
        }
    }

Вот мой макет xaml.

    <ContentPage.Resources>
        <ResourceDictionary>
            <local:MyValueConvert x:Key="intToBool" />

            <DataTemplate x:Key="validPersonTemplate">
                <ViewCell>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="0.4*" />
                            <ColumnDefinition Width="0.3*" />
                            <ColumnDefinition Width="0.3*" />
                        </Grid.ColumnDefinitions>
                        <Label Text="{Binding Name}" TextColor="Green" FontAttributes="Bold" />
                        <Label Grid.Column="1" Text="{Binding DateOfBirth, StringFormat='{0:d}'}" TextColor="Green" />
                        <Label Grid.Column="2" Text="{Binding Location, Converter={StaticResource intToBool}}" TextColor="Green" HorizontalTextAlignment="End" />
                    </Grid>
                </ViewCell>
            </DataTemplate>
            <DataTemplate x:Key="invalidPersonTemplate">
                <ViewCell>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="0.4*" />
                            <ColumnDefinition Width="0.3*" />
                            <ColumnDefinition Width="0.3*" />
                        </Grid.ColumnDefinitions>
                        <Label Text="{Binding Name}" TextColor="Red" FontAttributes="Bold" />
                        <Label Grid.Column="1" Text="{Binding DateOfBirth, StringFormat='{0:d}'}" TextColor="Red" />
                        <Label Grid.Column="2" Text="{Binding Location, Converter={StaticResource intToBool}}" TextColor="Red" HorizontalTextAlignment="End" />
                    </Grid>
                </ViewCell>
            </DataTemplate>
            <local:PersonDataTemplateSelector x:Key="personDataTemplateSelector" ValidTemplate="{StaticResource validPersonTemplate}" InvalidTemplate="{StaticResource invalidPersonTemplate}" />
        </ResourceDictionary>
    </ContentPage.Resources>
    <StackLayout Margin="20">
        <Label Text="ListView with a DataTemplateSelector" FontAttributes="Bold" HorizontalOptions="Center" />
        <ListView x:Name="listView" Margin="0,20,0,0" ItemTemplate="{StaticResource personDataTemplateSelector}" />
    </StackLayout>

Здесь запущен sceenshot.

enter image description here

Вот мое демо.

https://github.com/851265601/XFormsData-TempleSelect

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...