首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理2类用户

处理2类用户
EN

Stack Overflow用户
提问于 2021-07-18 17:01:41
回答 1查看 58关注 0票数 0

在我的应用程序中,我有两种类型的用户。基本上是一个卖家和一个用户。每种类型将有3页:配置文件页(卖方将有一些更多的属性,如评级,位置等)。

我的问题是:是否有办法处理同一视图模型(profileViewModel)中不同类型的用户。与asp .net核心一样,有一个函数/属性可以检查视图接收到的模型类型,并据此为页面创建自定义html。

我的用户还继承了一个IUser,其中列出了所有公共属性,而seller类只添加了它有额外属性的属性。

代码语言:javascript
复制
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的额外属性,我想我必须在视图模型和视图中进行类型检查,但这似乎不太正确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-19 06:09:11

是处理同一视图模型(profileViewModel)中不同类型的用户的一种方法。与asp .net核心一样,有一个函数/属性可以检查视图接收到的模型类型,并据此为页面创建自定义html。

您可以创建一个Xamarin.Forms DataTemplateSelector,以便根据数据绑定属性的值在运行时选择DataTemplate。我做了一个关于从ListView中选择一个项目的示例,然后选择DataTemplate来显示选择项。

类,使用类型属性区分用户和卖方。

代码语言:javascript
复制
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

代码语言:javascript
复制
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>
代码语言:javascript
复制
 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。您可以根据需要修改我的代码。

更新:

是的,您可以创建一个用户类和卖方类,卖方类继承用户类。

代码语言:javascript
复制
 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类更改为用户类。

代码语言:javascript
复制
 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类。

代码语言:javascript
复制
 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绑定属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68431335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档