未调用数据模板选择器
Data Template Selector not called
我有两种类型的用户(user/stylist 和设计师继承自用户),在个人资料页面中我需要构建不同的它所以我使用数据模板选择器但视图没有调用选择器
这是风景
<ContentPage.Resources>
<DataTemplate x:Key="UserTemplate">
<StackLayout>
<Label Text="I'm a user"/>
</StackLayout>
</DataTemplate>
<DataTemplate x:Key="StylistTemplate">
<StackLayout BackgroundColor="DarkBlue">
<Label Text="I'm a stylist"/>
</StackLayout>
</DataTemplate>
<local:UserTypeSelector
x:Key="personDataTemplateSelector"
StylistTemplate="{StaticResource StylistTemplate}"
UserTemplate="{StaticResource UserTemplate}" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout
Margin="10"
BindableLayout.ItemTemplateSelector="{StaticResource personDataTemplateSelector}"
BindableLayout.ItemsSource="{Binding User}" />
</ContentPage.Content>
选择器class
重要
我调试了它,根本没有调用 OnSelectTemplate
public class UserTypeSelector : DataTemplateSelector
{
public DataTemplate UserTemplate { get; set; }
public DataTemplate StylistTemplate { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
//return ((User)item).IsStylist ? StylistTemplate : UserTemplate
return StylistTemplate; this is for testing the selector
}
}
背后的代码
public partial class ProfilePage : ContentPage
{
public ProfilePage()
{
InitializeComponent();
BindingContext = new ProfileViewModel();
}
}
和视图模型
private User user { get; set; }
public User User { get; set; }
public ProfileViewModel()
{
//User = new User()
//{
// IsStylist = true, I tried to use this to test the selector but it throws
//}; an error **Object must implement IConvertible**
}
BindableLayout.ItemsSource 应指定布局显示的 IEnumerable
个项目的集合。
所以我修改了你的视图模型,然后就可以了。
ProfileViewModel:
class ProfileViewModel
{
public ObservableCollection<User> Users { get; set; }
public ProfileViewModel()
{
Users = new ObservableCollection<User>()
{
new User(){ IsStylist = false},new User(){ IsStylist = false}
};
}
public class User
{
public bool IsStylist { get; set; }
}
}
xaml :
<ContentPage.Resources>
<DataTemplate x:Key="UserTemplate">
<StackLayout>
<Label Text="I'm a user"/>
</StackLayout>
</DataTemplate>
<DataTemplate x:Key="StylistTemplate">
<StackLayout BackgroundColor="DarkBlue">
<Label Text="I'm a stylist"/>
</StackLayout>
</DataTemplate>
<local:UserTypeSelector
x:Key="personDataTemplateSelector"
StylistTemplate="{StaticResource StylistTemplate}"
UserTemplate="{StaticResource UserTemplate}" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout
Margin="10"
BindableLayout.ItemTemplateSelector="{StaticResource personDataTemplateSelector}"
BindableLayout.ItemsSource="{Binding Users}" />
</ContentPage.Content>
我有两种类型的用户(user/stylist 和设计师继承自用户),在个人资料页面中我需要构建不同的它所以我使用数据模板选择器但视图没有调用选择器
这是风景
<ContentPage.Resources>
<DataTemplate x:Key="UserTemplate">
<StackLayout>
<Label Text="I'm a user"/>
</StackLayout>
</DataTemplate>
<DataTemplate x:Key="StylistTemplate">
<StackLayout BackgroundColor="DarkBlue">
<Label Text="I'm a stylist"/>
</StackLayout>
</DataTemplate>
<local:UserTypeSelector
x:Key="personDataTemplateSelector"
StylistTemplate="{StaticResource StylistTemplate}"
UserTemplate="{StaticResource UserTemplate}" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout
Margin="10"
BindableLayout.ItemTemplateSelector="{StaticResource personDataTemplateSelector}"
BindableLayout.ItemsSource="{Binding User}" />
</ContentPage.Content>
选择器class
重要 我调试了它,根本没有调用 OnSelectTemplate
public class UserTypeSelector : DataTemplateSelector
{
public DataTemplate UserTemplate { get; set; }
public DataTemplate StylistTemplate { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
//return ((User)item).IsStylist ? StylistTemplate : UserTemplate
return StylistTemplate; this is for testing the selector
}
}
背后的代码
public partial class ProfilePage : ContentPage
{
public ProfilePage()
{
InitializeComponent();
BindingContext = new ProfileViewModel();
}
}
和视图模型
private User user { get; set; }
public User User { get; set; }
public ProfileViewModel()
{
//User = new User()
//{
// IsStylist = true, I tried to use this to test the selector but it throws
//}; an error **Object must implement IConvertible**
}
BindableLayout.ItemsSource 应指定布局显示的 IEnumerable
个项目的集合。
所以我修改了你的视图模型,然后就可以了。
ProfileViewModel:
class ProfileViewModel
{
public ObservableCollection<User> Users { get; set; }
public ProfileViewModel()
{
Users = new ObservableCollection<User>()
{
new User(){ IsStylist = false},new User(){ IsStylist = false}
};
}
public class User
{
public bool IsStylist { get; set; }
}
}
xaml :
<ContentPage.Resources>
<DataTemplate x:Key="UserTemplate">
<StackLayout>
<Label Text="I'm a user"/>
</StackLayout>
</DataTemplate>
<DataTemplate x:Key="StylistTemplate">
<StackLayout BackgroundColor="DarkBlue">
<Label Text="I'm a stylist"/>
</StackLayout>
</DataTemplate>
<local:UserTypeSelector
x:Key="personDataTemplateSelector"
StylistTemplate="{StaticResource StylistTemplate}"
UserTemplate="{StaticResource UserTemplate}" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout
Margin="10"
BindableLayout.ItemTemplateSelector="{StaticResource personDataTemplateSelector}"
BindableLayout.ItemsSource="{Binding Users}" />
</ContentPage.Content>