Чтобы настроить внешний вид определенного элемента в 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, происходит сбой приложения. Это обязательная ошибка или я что-то не так делаю?