如何构建动态(由db决定的UI控件)XAML页面?

如何构建动态(由db决定的UI控件)XAML页面?,xaml,xamarin.forms,Xaml,Xamarin.forms,我正在努力解决以下问题。在我的XF应用程序中,我的页面必须是动态的——页面上呈现的控件(对于每个类别“位置”、“性别”)由数据库表确定 数据库表具有类似的架构: 如何用尽可能少的C#(主要是XAML)以“更好”的方式实现页面设计?我正在寻找任何建议和想法。没有简单的解决方案。 我也做过类似的事情,尽管它需要很多代码,甚至不能简单地复制/粘贴 不过,我将尝试简要介绍一下我的解决方案 如果我没看错的话,您希望有一个选项卡式页面,其中包含从数据源生成的动态子页面 1)型号 您将需要某种工厂类,它将

我正在努力解决以下问题。在我的XF应用程序中,我的页面必须是动态的——页面上呈现的控件(对于每个类别“位置”、“性别”)由数据库表确定

数据库表具有类似的架构:


如何用尽可能少的C#(主要是XAML)以“更好”的方式实现页面设计?我正在寻找任何建议和想法。

没有简单的解决方案。 我也做过类似的事情,尽管它需要很多代码,甚至不能简单地复制/粘贴

不过,我将尝试简要介绍一下我的解决方案

如果我没看错的话,您希望有一个选项卡式页面,其中包含从数据源生成的动态子页面

1)型号 您将需要某种工厂类,它将获取您的数据并从中构建一些UIElementModels。 这些模型应该以抽象的方式描述您的UI,以便它们包含您想要使用的UI元素的所有信息,例如显示的文本和实际值

public class UIElementModel
{
    public object ElementValue {get;set;}
    public string Text {get;set;}
}
然后针对特定元素推导改进的模型

public class UIButtonModel : UIElementModel
{
    public Command ClickAction {get;set;}
}

public class UIEntryModel : UIElementModel
{
    public string Placeholder {get;set;}
}

public class UIPickerModel : UIElementModel
{
    public List<string> Items {get;set;}
}
公共类UIButtonModel:UIElementModel
{
公共命令ClickAction{get;set;}
}
公共类UIEntryModel:UIElementModel
{
公共字符串占位符{get;set;}
}
公共类UIPickerModel:UIElementModel
{
公共列表项{get;set;}
}
等等。您可以随时添加所需内容,以定义要显示的元素的内容和视觉效果

2)元素和页面

接下来,您必须创建从基本UI元素派生的自定义UI元素。 例如,如果您有一个按钮,那么创建一个DynamicButton类,该类将接受UIButtonModel作为绑定上下文。我还建议提供一个构造函数,您可以在其中移交这样一个模型

然后创建一个从ContentPage派生的DynamicPage,它将接受其构造函数中的列表。 创建此页面的新实例时,您可以通过编程方式迭代ui模型列表,创建相关自定义ui元素的实例并将其放入页面:

伪代码:

public DynamicPage(List<UIElementModel> uiElements) : ContentPage
{
    InitializeComponent();
    foreach (UIElementModel model in uiElements)
    {
        if (model.Type == UIEntryModel)
        {
            DynamicEntry entry = new DynamicEntry(model);
            this.ElementStackLayout.Children.Add(entry);
        }
        if (model.Type == UIButtonModel)
        {
            DynamicButton button = new DynamicButton(model);
            this.ElementStackLayout.Children.Add(button );
        }
        ...
        // add more elements as needed
    }
}
publicdynamicpage(列出uiElements):ContentPage
{
初始化组件();
foreach(UIElementModel在uiElements中的模型)
{
if(model.Type==UIEntryModel)
{
DynamicCentry条目=新的DynamicCentry(模型);
this.ElementStackLayout.Children.Add(条目);
}
if(model.Type==UIButtonModel)
{
DynamicButton按钮=新的DynamicButton(型号);
this.ElementStackLayout.Children.Add(按钮);
}
...
//根据需要添加更多元素
}
}

一旦你创建了屏幕,你就可以把它们放到一个标签页中,你应该准备好了。

我认为没有一种“简单”的方法可以做到这一点,它不需要太多的C。您可以在XAML ContentView中定义每种类型的控件,并使用这些块来构建UI,但仍然需要C#来解析UI定义并构建布局。@Jason感谢您的建议。是的,我同意没有任何C#就无法解决这个问题。我喜欢你的建议,我会尝试为每个控件创建一个XAML ContentView,看看它是如何为我工作的。谢谢你提供了详细而翔实的答案!这肯定会有所帮助,我将尝试这种方法。