xamarin 在.net Maui中切换不同页面元素组的可见性有什么替代方法吗?

k5ifujac  于 2022-12-07  发布在  .NET
关注(0)|答案(1)|浏览(177)

我需要建立一个页面,其中有一些静态的“始终存在”的元素,和一些交替组的元素,显示和隐藏取决于用户的行动。
一种方法是将每组元素组合到某个容器(如StackLayout)中,并控制它们的可见性,如下所示:

<StackLayout IsVisible="{Binding IsLoaded}">...</StackLayout>

<StackLayout IsVisible="{Binding IsLoaded}, Converter={helpers:InverseBoolConverter}">...</StackLayout>

然而,如果有超过2组这样的元素,就会增加更多的开销,我觉得必须存在一种更好的实现方式。
我找到的是DataTemplateSelector,但是:它似乎适用于“项目列表”类型的控件。我想知道ContentPage或非列表控件是否存在类似的东西,因此我可以定义2个或更多的替代模板(或控件),这些模板绑定到内部的同一个ViewModel,并基于页面ViewModel数据切换它们的可见性:ViewModel.IsLoaded=true显示一个模板/控件,否则显示另一个。
注意:不同的控件样式对于我的场景是不够的,它是不同的控件集。

23c0lvtd

23c0lvtd1#

StackLayout can specify a DataTemplateSelector in its BindableLayout.ItemTemplateSelector :

<StackLayout BindableLayout.ItemsSource="{Binding Source}" 
             BindableLayout.ItemTemplateSelector="{StaticResource TemplateSelector}"/>

BindableLayout.ItemsSource might be a collection containing one item:

Source = new ObservableCollection<Model>
{ 
  model
};

The DataTemplateSelector might be triggered as follows:

Source.Clear();
Source.Add(model);

Sample 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;
  }
}

Sample usage in XAML:

<DataTemplate x:Key="DataTemplate1">
...
<DataTemplate x:Key="DataTemplate2">
...
<namespace:TemplateSelector x:Key="TemplateSelector" 
  DataTemplate1="{StaticResource DataTemplate1}" 
  DataTemplate2="{StaticResource DataTemplate2}" />

相关问题