Как удалить / показать StackLayout через код моего представления с MVVM - PullRequest
0 голосов
/ 10 октября 2018

Вы хотите скрыть StackLayout в зависимости от значения свойства, которое оценивается в конструкторе, но при его скрытии xamarin оставляет пустым и не загружает нижние элементы вверх, поэтому я удалю элемент с помощью кода позади (Я использую MVVM)

Example

Но я не знаю, как структурировать свой код, чтобы я мог оценить, исключаю ли я StackLayout, когдазагрузка Vista

На мой взгляд, я занимаю X: Name, чтобы определить элемент, который я хочу удалить или показать после оценки условия.

MyView.XAML:

        <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"           
                     BindingContext="{Binding Main, Source={StaticResource Locator}}"
                     x:Class="AppValora.Views.Sisquim.VerSisquimView">

     <StackLayout       
                    Orientation="Horizontal"
                  HorizontalOptions="CenterAndExpand"
                    VerticalOptions="Start">

                    <Image
                        HorizontalOptions="Center"
                        Source="{Binding ImageRombo}"                 
                       HeightRequest="160"
                       WidthRequest="160"
                        IsVisible="{Binding IsVisibleImagenRombo}">                
                    </Image> 
                    <Image 
                        HorizontalOptions="Center"
                        Source="cuadro_nch"                  
                        HeightRequest="160"
                       WidthRequest="160">
                     </Image>
                </StackLayout>     

// STACKLAYOUT YOU WANT TO ELIMINATE
         <StackLayout 
            x:Name="StackIsVisible">                
                            <Image 
                                Source="{Binding ImageRomboDos}"                 
                               HeightRequest="160"
                               WidthRequest="160"
                               IsVisible="{Binding IsVisibleImagenRombo}">
                            </Image>
            </StackLayout>

        </ContentPage>

В моей ViewModel я получаю параметр, который я затем оцениваю в условном

MyViewModel.CS:

public VerSisquimViewModel(SqsHelper sqsHelper)
        {
           if (sqsHelper.RSEC == null)
            {
                IsVisibleLabelRomboImagenDos = false;
            }        

        }

Какую магию я могу сделать в моем коде, чтобы приусловие выполнено, устранить StackLayout и удалить это пустое пространство?

в настоящее время у меня есть ....

MyView.cs (CODE BEHIND):

public partial class MyView : ContentPage
{
    StackLayout hiddenStackLayout;

    public VerSisquimView ()
    {
        NavigationPage.SetBackButtonTitle(this, "");
        StackIsVisible.Children.RemoveAt(1);
        InitializeComponent();

    }

}

какмогу ли я из кода позади Чанge значение свойства, когда я запускаю эту страницу?

Это плохая практика использовать код с шаблоном MVVM?

Как я могу это исправить?любая помощь для меня?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Является ли плохой практикой использование кода с шаблоном MVVM?

Если код связан с представлением, то это необходимо.Иногда вы просто не можете избежать кода в коде позади.Имейте в виду правило: обычно , когда вы начинаете работать с представлением, управление вещами может оказаться довольно громоздким.Если вы найдете способ использовать платформу, в данном случае Xaml, пусть она сделает всю работу за вас.

вещь о видимости, элемент отображается на экране.Пользователь просто не может видеть это.Вот почему пространство занято.Иногда видимость будет работать, а иногда не так много.

В этой ситуации вы можете избежать кода в выделенном коде и придерживаться своей виртуальной машины.

Я бы предложил использовать сетку и использовать конвертер, чтобы скрыть строку сетки.Когда я говорю «скрыть строку», я имею в виду, устанавливая высоту строки равной 0. Таким образом, она отображается, но мы собираемся свернуть ее.Я добавил только две строки, вы можете добавить больше, чтобы разместить больше контента по своему усмотрению.

Редактировать: добавлено примерное пространство имен.Если вы используете Visual Studio, там должен быть intellisense.Вы должны добавить локальное пространство имен, чтобы механизм xaml мог найти класс конвертера.

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"          
                     xmlns:converter="clr-namespace:DataBindingDemos" <-- set the appropriate value
                     BindingContext="{Binding Main, Source={StaticResource Locator}}"                     
                     x:Class="AppValora.Views.Sisquim.VerSisquimView">
    <ContentPage.Resources>
        <converter:BoolToGridRowVisibilityConverter key="BoolToGridRowVisibilityConverter">
    </ContentPage.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="{Binding IsStackVisible, Converter={StaticResource BoolToGridRowVisibilityConverter}}" />
        </Grid.RowDefinitions>
         <StackLayout   
                    Grid.Row="0"    
                    Orientation="Horizontal"
                    HorizontalOptions="CenterAndExpand"
                    VerticalOptions="Start">

                    <Image
                        HorizontalOptions="Center"
                        Source="{Binding ImageRombo}"                 
                       HeightRequest="160"
                       WidthRequest="160"
                        IsVisible="{Binding IsVisibleImagenRombo}">                
                    </Image> 
                    <Image 
                        HorizontalOptions="Center"
                        Source="cuadro_nch"                  
                        HeightRequest="160"
                       WidthRequest="160">
                     </Image>
                </StackLayout>     

         <!-- STACKLAYOUT YOU WANT TO ELIMINATE -->
        <StackLayout    Grid.Row="1" 
                        x:Name="StackIsVisible">                
                            <Image 
                                Source="{Binding ImageRomboDos}"                 
                               HeightRequest="160"
                               WidthRequest="160"
                               IsVisible="{Binding IsVisibleImagenRombo}">
                            </Image>
            </StackLayout>
    </Grid>
</ContentPage>

Добавить конвертер

public class BoolToGridRowVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? new GridLength(1, GridUnitType.Auto) : new GridLength(0);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("Only one way bindings are supported with this converter");
    }}
}

Для получения дополнительной информации см. сообщение на форумах Xamarin

0 голосов
/ 10 октября 2018

Вы можете поместить IsVisible = "{Binding IsVisibleImagenRombo}" в стек StackIsVisible, так что все пространство будет стерто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...