Проблема с Xamarin Forms 4 (до 9) с использованием привязки ItemTemplate в CollectionView - PullRequest
0 голосов
/ 19 апреля 2019

Чтобы настроить внешний вид определенного элемента в CollectionView, я использую DataTemplateSelector, чтобы выбрать DataTemplate во время выполнения на основе значения свойства с привязкой к данным. Но, в отличие от того, что происходит в ListView, привязка данных, по-видимому, не работает для ItemTemplate в CollectionView.

Я уже проверил свое решение с ListView вместо CollectionView, и оно работает. Все работает нормально, даже если я заменю привязку ItemTemplate ресурса на встроенную ItemTemplate.

Я пытаюсь настроить различные объекты, которые наследуются от ISensor. Похоже

public interface ISensor
{
    string Name { get; set; }
    // ...
}

Это модель вида:

public class TestViewModel : MvxNavigationViewModel
{
    private static ObservableCollection<ISensor> _SensorList;

    public TestViewModel(IMvxLogProvider logProvider, IMvxNavigationService navigation)
        : base(logProvider, navigation)
    {
        _SensorList = new ObservableCollection<ISensor> { new Sensor("Thermostat"), null };
    }

    public ObservableCollection<ISensor> SensorsSource { get => _SensorList; }
}

И это страница, содержащая CollectionView:

<ContentView>
    <StackLayout>
        <CollectionView ItemsSource="{Binding SensorsSource}" ItemTemplate="{StaticResource SensorsTemplate}" Margin="10">
            <CollectionView.ItemsLayout>
                <GridItemsLayout Orientation="Vertical" Span="2"/>
            </CollectionView.ItemsLayout>

            <CollectionView.EmptyView>
                <StackLayout>
                    <Label Text="Add a new sensor"/>
                </StackLayout>
            </CollectionView.EmptyView>
        </CollectionView>

    </StackLayout>
</ContentView>

DataTemplateSelector:

public class SensorSelector : DataTemplateSelector
{
    public DataTemplate EmptyTemplate { get; set; }
    public DataTemplate SensorTemplate { get; set; }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        if (item is Sensor)
            return SensorTemplate;
        return EmptyTemplate;
    }
}

DataTemplate, присутствующий в файле App.xaml:

<DataTemplate x:Key="EmptyDataTemplate">
    <ViewCell>
        <StackLayout BackgroundColor="Yellow">
            <Label Text="EMPTY"/>
        </StackLayout>
    </ViewCell>
</DataTemplate>
<DataTemplate x:Key="SensorDataTemplate">
    <ViewCell>
        <StackLayout BackgroundColor="Red">
            <Label Text="{Binding Name}"/>
        </StackLayout>
    </ViewCell>
</DataTemplate>
<Selectors:SensorSelector x:Key="SensorsTemplate" 
                          EmptyTemplate="{StaticResource EmptyDataTemplate}"
                          SensorTemplate="{StaticResource SensorDataTemplate}"/>

Каждый раз, когда я вхожу в TestViewModel, происходит сбой приложения. Это обязательная ошибка или я что-то не так делаю?

1 Ответ

0 голосов
/ 19 апреля 2019

В ListView дочерний элемент DataTemplate, используемый в качестве ItemTemplate, должен быть ViewCell (или наследоваться от него).С CollectionView вы не можете иметь ViewCell на месте.Другими словами, у вас не может быть DataTemplate, который работает одновременно с ListView и CollectionView.Удаление слоя ViewCell в ваших шаблонах данных должно исправить сбой при использовании с CollectionView:

<DataTemplate x:Key="EmptyDataTemplate">
    <StackLayout BackgroundColor="Yellow">
        <Label Text="EMPTY"/>
    </StackLayout>
</DataTemplate>

И эквивалентное изменение для SensorDataTemplate.

...