在.net毛伊岛,除了切换不同组的页面元素可见性之外,还有其他选择吗



我需要构建一个具有一些静态"总是在那里";元素,以及根据用户操作显示和隐藏的一些替换元素组。

一种方法可以将每组元素组合到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}" />

最新更新