Как остановить Xamarin от инициализации каждого представления в XAML? - PullRequest
1 голос
/ 11 января 2020

У меня есть два пользовательских представления на странице, только одно из них должно быть видно одновременно. Я хочу, чтобы представление было инициализировано только тогда, когда оно станет видимым *. Но происходит то, что 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 получает fre sh new View1() и то же самое с View2, но оба они инициализируются при загрузке страницы только в первый раз.

Чтобы проиллюстрировать, зачем мне это нужно, у меня есть страница, на которой отображается либо карта, либо CollectionView. Из-за ограничений привязки в элементе управления картой я выполняю всю работу, когда элемент управления инициализируется в выделенном фрагменте кода, поэтому всякий раз, когда представление, содержащее карту, становится видимым (это означает, что данные могли измениться), мне необходимо повторно инициализировать элемент управления для обновления карты.

Чего я хочу добиться, в соответствии с приведенным выше примером, когда настраиваемое представление становится видимым, я хочу, чтобы оно было инициализировано, будь то при загрузке страницы или при изменении привязки данных.

* на visibility I m Это может быть не только свойство IsVisible.

1 Ответ

1 голос
/ 11 января 2020

Немного неясно, является ли то, что вы пытаетесь достичь, наилучшим подходящим способом, но в любом случае, чтобы иметь то, что вам нужно, нужно сделать следующее:

1 Для этого случая забудьте триггеры и создайте пользовательский элемент управления (если вы не уверены, как тогда я мог бы обновить этот ответ), который реагировал бы на вашу ViewModel и устанавливал содержимое для соответствующего представления из кода, например

this.Content = new View1();

2, поместите этот пользовательский элемент управления вместо того, что вы на самом деле, например:

<controls:MyUberControl Mode="{Binding ViewType}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...