我需要构建一个具有一些静态"总是在那里";元素,以及根据用户操作显示和隐藏的一些替换元素组。
一种方法可以将每组元素组合到StackLayout
这样的容器中,并控制它们的可见性,如下所示:
<StackLayout IsVisible="{Binding IsLoaded}">...</StackLayout>
<StackLayout IsVisible="{Binding IsLoaded}, Converter={helpers:InverseBoolConverter}">...</StackLayout>
然而,如果有两组以上这样的元素,就会增加更多的开销,我觉得必须有一种更好的实现方式。
然而,我发现DataTemplateSelector:它似乎适用于";项目列表";控件的类型。我想知道ContentPage或非列表控件是否存在类似的东西,所以我可以定义两个或多个内部绑定到同一ViewModel的替代模板(或控件(,并根据页面ViewModel数据切换它们的可见性:ViewModel。IsLoaded=true显示一个模板/控件,否则显示另一个。
注意:对于我的场景来说,不同的控件样式是不够的,它是不同的控件集。
StackLayout
可以在其BindableLayout.ItemTemplateSelector
:中指定DataTemplateSelector
<StackLayout BindableLayout.ItemsSource="{Binding Source}"
BindableLayout.ItemTemplateSelector="{StaticResource TemplateSelector}"/>
BindableLayout.ItemsSource
可能是包含一个项目的集合:
Source = new ObservableCollection<Model>
{
model
};
DataTemplateSelector
可能被触发如下:
Source.Clear();
Source.Add(model);
样品DataTemplateSelector
:
public class TemplateSelector : DataTemplateSelector
{
public DataTemplate DataTemplate1 { get; set; }
public DataTemplate DataTemplate2 { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
Model model = item as Model;
// Determine template; DataTemplate1 or DataTemplate2
return template;
}
}
XAML中的示例用法:
<DataTemplate x:Key="DataTemplate1">
...
<DataTemplate x:Key="DataTemplate2">
...
<namespace:TemplateSelector x:Key="TemplateSelector"
DataTemplate1="{StaticResource DataTemplate1}"
DataTemplate2="{StaticResource DataTemplate2}" />