在我的应用程序中,我有两种类型的用户。基本上是一个卖家和一个用户。每种类型将有3页:配置文件页(卖方将有一些更多的属性,如评级,位置等)。
我的问题是:是否有办法处理同一视图模型(profileViewModel)中不同类型的用户。与asp .net核心一样,有一个函数/属性可以检查视图接收到的模型类型,并据此为页面创建自定义html。
我的用户还继承了一个IUser,其中列出了所有公共属性,而seller类只添加了它有额外属性的属性。
public class Stylist: BaseRecord<Stylist>
{
public float Rating { get; set; }
public string Location { get; set; }
public bool IsSchedualeVisible { get; set; }
}
public interface IUser
{
[PrimaryKey, AutoIncrement]
int id { get; set; }
string Name { get; set; }
string Email { get; set; }
string ProfilePic { get; set; }
string Password { get; set; }
string PasswordConfirmation { get; set; }
string Phone { get; set; }
bool IsUser { get; set; }
bool IsEmailVerified { get; set; }
bool IsPhoneVerified { get; set; }
object Clone();
}
public abstract class BaseRecord<T> : IUser
{
[PrimaryKey, AutoIncrement]
public int id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string ProfilePic { get; set; }
public string Password { get; set; }
public string PasswordConfirmation { get; set; }
public string Phone { get; set; }
public bool IsUser { get; set; }
public bool IsEmailVerified { get; set; }
public bool IsPhoneVerified { get; set; }
public object Clone()
{
var newRecord = Activator.CreateInstance<T>();
var props = newRecord.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanRead);
foreach (var p in props) p.SetValue(newRecord, p.GetValue(this));
return newRecord;
}
}
public class User: BaseRecord<User>
{
}现在,在日志记录之后,我在App.cs中保存一个IUser对象,并且在ProfileViewModel中使用它,但是我仍然有Stylist的额外属性,我想我必须在视图模型和视图中进行类型检查,但这似乎不太正确。
发布于 2021-07-19 06:09:11
是处理同一视图模型(profileViewModel)中不同类型的用户的一种方法。与asp .net核心一样,有一个函数/属性可以检查视图接收到的模型类型,并据此为页面创建自定义html。
您可以创建一个Xamarin.Forms DataTemplateSelector,以便根据数据绑定属性的值在运行时选择DataTemplate。我做了一个关于从ListView中选择一个项目的示例,然后选择DataTemplate来显示选择项。
类,使用类型属性区分用户和卖方。
public enum ptype
{
User,
Seller
}
public class person
{
public ptype type { get; set; }
public string name{ get;set;}
public int age { get; set; }
public string selleraddress { get; set; }
}
<ListView ItemSelected="ListView_ItemSelected" ItemsSource="{Binding persons}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding name}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
public partial class Page4 : ContentPage
{
public ObservableCollection<person> persons { get; set; }
public Page4()
{
InitializeComponent();
persons = new ObservableCollection<person>()
{
new person(){type=ptype.User, name="user",age=18},
new person(){type=ptype.Seller,name="seller",age=19,selleraddress="this is test"}
};
this.BindingContext = this;
}
private async void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
person p = (person)e.SelectedItem;
await Navigation.PushAsync(new Page3(p));
}
}然后创建DataTemplateSelector
public class PersonDataTemplateSelector : DataTemplateSelector
{
public DataTemplate userTemplate { get; set; }
public DataTemplate sellerTemplate { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
return ((person)item).type==ptype.User ? userTemplate : sellerTemplate;
}
}
<ContentPage
x:Class="FormsSample.datatemplate.Page3"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:FormsSample.datatemplate">
<ContentPage.Resources>
<DataTemplate x:Key="userTemplate">
<StackLayout>
<Label Text="{Binding name}" />
<Label Text="{Binding age}" />
</StackLayout>
</DataTemplate>
<DataTemplate x:Key="SellerTemplate">
<StackLayout BackgroundColor="DarkBlue">
<Label Text="{Binding name}" />
<Label Text="{Binding age}" />
<Label Text="{Binding selleraddress}" />
</StackLayout>
</DataTemplate>
<local:PersonDataTemplateSelector
x:Key="personDataTemplateSelector"
sellerTemplate="{StaticResource SellerTemplate}"
userTemplate="{StaticResource userTemplate}" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout
Margin="10"
BindableLayout.ItemTemplateSelector="{StaticResource personDataTemplateSelector}"
BindableLayout.ItemsSource="{Binding persons}" />
</ContentPage.Content> public partial class Page3 : ContentPage
{
public ObservableCollection<person> persons { get; set; }
//private person _user;
//public person user
//{
// get { return _user; }
// set
// {
// _user = value;
// RaisePropertyChanged("user");
// }
//}
public Page3(person p)
{
InitializeComponent();
persons = new ObservableCollection<person>();
persons.Add(p);
//user = p;
this.BindingContext = this;
}
}现在我可以根据人的类型选择不同的DataTemplate。您可以根据需要修改我的代码。
更新:
是的,您可以创建一个用户类和卖方类,卖方类继承用户类。
public class user
{
public ptype type { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
public class Seller:user
{
public string location { get; set; }
public string products_to_sell { get; set; }
}然后将相应的person类更改为用户类。
public partial class Page4 : ContentPage
{
public ObservableCollection<user> users { get; set; }
public Page4()
{
InitializeComponent();
users = new ObservableCollection<user>()
{
new Seller(){type=ptype.User,Name="user 1",Email=""},
new Seller(){type=ptype.Seller,Name="seller 1",Email="",location="location 1",products_to_sell=""}
};
this.BindingContext = this;
}
private async void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
user p = (user)e.SelectedItem;
await Navigation.PushAsync(new Page3(p));
}
}不要忘记在PersonDataTemplateSelector中更改person类。
public class PersonDataTemplateSelector : DataTemplateSelector
{
public DataTemplate userTemplate { get; set; }
public DataTemplate sellerTemplate { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
return ((user)item).type==ptype.User ? userTemplate : sellerTemplate;
}
}最后,您需要修改ContentPage绑定属性。
https://stackoverflow.com/questions/68431335
复制相似问题