Рамка форм Xamarin не расширяется вместе с контентом - PullRequest
0 голосов
/ 04 марта 2019

Я новичок в формах Xamarin, и я выполнил свой первый вызов.Я хочу рамку вокруг моего Stacklayout в Listview.Когда пользователь выбирает элемент в ListView, я хочу, чтобы отображались некоторые элементы управления.Это прекрасно работает без рамки, но рамка не расширяется, когда появляются элементы управления.Как я могу изменить или обойти это поведение?Код ниже.

XAML:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:MVVMTest"
         x:Class="MVVMTest.MainPage">
<StackLayout>
    <ListView HasUnevenRows="True" SelectedItem="{Binding SelectedViewItem, Mode=TwoWay}" ItemsSource="{Binding Items}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Frame BackgroundColor="White" BorderColor="Black">
                        <StackLayout>
                            <Label Text="{Binding Name}"></Label>
                            <Entry Text="{Binding Details}" IsVisible="{Binding ShowDetails}"></Entry>
                        </StackLayout>
                    </Frame>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

XAML.cs

namespace MVVMTest
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            BindingContext = new ViewModel()
            {
                Items = new List<ViewModelItem>()
                {
                    new ViewModelItem()
                    {
                        Name = "Test",
                        Details = "details"
                    },
                    new ViewModelItem()
                    {
                        Name = "Test2",
                        Details = "details2"
                    }
                }
            };
            InitializeComponent();
        }
    }
}

Модель:

namespace MVVMTest
{
    public class ViewModel : INotifyPropertyChanged
    {
        private ViewModelItem _selectedViewItem;
        private List<ViewModelItem> _items;

        public event PropertyChangedEventHandler PropertyChanged;
        void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public ViewModelItem SelectedViewItem
        {
            get
            {
                return _selectedViewItem;
            }
            set
            {
                _selectedViewItem = value;
                OnPropertyChanged();
                if (value != null)
                {
                    value.ShowDetails = !value.ShowDetails;
                    SelectedViewItem = null;
                }
            }
        }

        public List<ViewModelItem> Items
        {
            get
            {
                return _items;
            }
            set
            {
                _items = value;
                OnPropertyChanged();
            }
        }

        public ViewModel()
        {

        }
    }

    public class ViewModelItem : INotifyPropertyChanged
    {
        private bool _showDetails;
        private string _details;
        private string _name;

        public event PropertyChangedEventHandler PropertyChanged;
        void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
                OnPropertyChanged();
            }
        }

        public bool ShowDetails
        {
            get
            {
                return _showDetails;
            }
            set
            {
                _showDetails = value;
                OnPropertyChanged();
            }
        }

        public string Details
        {
            get
            {
                return _details;
            }
            set
            {
                _details = value;
                OnPropertyChanged();
            }
        }
    }
}

1 Ответ

0 голосов
/ 06 марта 2019

В итоге я использовал событие PropertyChanged, чтобы реагировать на отображение или скрытие ListView.В обработчике событий я установил параметр HeightRequest для фрейма, и это заставляет его изменить свой размер.

Альтернативное решение / помощь можно найти здесь:

https://forums.xamarin.com/discussion/comment/366577

XAML:

<StackLayout>
    <ListView HasUnevenRows="True" SelectedItem="{Binding SelectedViewItem, Mode=TwoWay}" ItemsSource="{Binding Items}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Frame BackgroundColor="White" BorderColor="Black" Margin="2" Padding="2" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
                        <StackLayout>
                            <Label Text="{Binding Name}"></Label>
                            <ListView HasUnevenRows="True" Margin="2" ItemsSource="{Binding DetailObjects}" IsVisible="{Binding ShowDetails}" PropertyChanged="ListView_PropertyChanged">
                                <ListView.ItemTemplate>
                                    <DataTemplate>
                                        <ViewCell>
                                            <Entry Text="{Binding Details}"></Entry>
                                        </ViewCell>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                        </StackLayout>
                    </Frame>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

Код:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        BindingContext = new ViewModel()
        {
            Items = new List<ViewModelItem>()
            {
                new ViewModelItem()
                {
                    Name = "Test",
                    DetailObjects = new List<ViewModelItemDetails>
                    {
                        new ViewModelItemDetails
                        {
                            Details = "details1"
                        },
                        new ViewModelItemDetails
                        {
                            Details = "details2"
                        }
                    }
                },
                new ViewModelItem()
                {
                    Name = "Test2",
                    DetailObjects = new List<ViewModelItemDetails>
                    {
                        new ViewModelItemDetails
                        {
                            Details = "details1"
                        },
                        new ViewModelItemDetails
                        {
                            Details = "details2"
                        }
                    }
                }
            }
        };
        InitializeComponent();
    }

    private void ListView_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (!(sender is ListView list)) return;
        if (e.PropertyName == ListView.IsVisibleProperty.PropertyName)
        {
            Element parent = list;
            Frame frame = null;
            while (frame == null && parent != null)
            {
                if (parent is Frame) frame = parent as Frame;
                parent = parent.Parent;
            }

            if (list.IsVisible)
            {
                list.HeightRequest = list.ItemsSource.Cast<ViewModelItemDetails>().Count() * 50;

                if (frame != null) frame.HeightRequest = list.HeightRequest + 50;
            }
            else
            {
                if (frame != null) frame.HeightRequest = 50;
            }
        }
    }
}
...