【问题标题】:How to stop Xamarin from initializing every view in XAML?如何阻止 Xamarin 初始化 XAML 中的每个视图?
【发布时间】:2020-04-28 15:13:30
【问题描述】:

我在一个页面中有两个自定义视图,一次只能看到其中一个。 我希望仅在视图变得可见时才初始化视图*。但是发生的情况是 Xamarin 初始化页面中的每个视图,我尝试了几种方法,试图告诉 Xamarin:“现在不要初始化它”,这是其中之一:

<ContentView>
    <ContentView.Triggers>
        <DataTrigger TargetType="ContentView" Binding="{Binding ViewType,Mode=TwoWay}" Value="0">
            <Setter Property="Content">
                <Setter.Value>
                    <views:View1/>
                </Setter.Value>
            </Setter>
        </DataTrigger>
        <DataTrigger TargetType="ContentView" Binding="{Binding ViewType,Mode=TwoWay}" Value="1">
            <Setter Property="Content">
                <Setter.Value>
                    <views:View2/>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </ContentView.Triggers>
</ContentView>

我第一次尝试这段代码时的预期是:当ViewType 更改为0 时,Content 属性会得到一个新的new View1(),与View2 相同,但两者都在页面仅在第一次加载。

为了说明我为什么需要这个,我有一个显示地图或CollectionView 的页面,由于地图控件中的绑定限制,我在代码隐藏中初始化控件时完成所有工作,所以每当持有地图的视图变得可见(意味着数据可能已更改)时,我需要重新初始化控件以更新地图。

根据上面的例子,我想要实现的是,当自定义视图变得可见时,我希望它被初始化,无论是在页面加载时还是在数据绑定发生变化时。

*by visibility 我的意思是它在显示器上的存在,而不是严格意义上的IsVisible 属性。

【问题讨论】:

  • 如果你想要更多的控制,然后用 C# 构建它,而不是 XAML
  • 我希望至少现在远离这个选项,这个项目老旧且复杂,无法进行此更改
  • 这就是DataTriggers 的工作方式,它们使所有选项都准备就绪,并在触发器被调用后立即替换!
  • @FreakyAli 我认为 XAML 页面中的每个视图在页面加载时都会被初始化,无论它是如何嵌入的
  • 这不是我们通常想要的吗?你的情况显然是个例外

标签: xaml xamarin.forms data-binding custom-controls


【解决方案1】:

目前还不清楚您要达到的目标是否是最合适的方式,但无论如何,要拥有您需要做的事情,请执行以下操作:

1 对于这种情况,请忘记触发器并创建一个自定义控件(如果您不确定如何更新此答案),它将对您的 ViewModel 做出反应并从代码隐藏中将内容设置为适当的视图,例如

this.Content = new View1();

2 放置这个自定义控件而不是你实际拥有的控件,例如:

<controls:MyUberControl Mode="{Binding ViewType}">

【讨论】:

  • 这是什么?你能澄清一下..自定义控件的用途是什么?
  • 你的意思是在ModepropertyChanged 中我更改了Content 属性?
  • 是的,你完全正确。您还需要更多帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多