在Observable Collection更改后,Xamarin表单刷新布局

时间:2017-08-04 10:53:13

标签: c# xaml xamarin xamarin.forms

我正在尝试“刷新”其中一个我正在使用WrapLayout的视图。即使我更改ObservableCollection中的项目,页面也不会显示所做的更改。

下面的代码(由于机密性问题需要进行一些混淆,但我认为最重要的部分就是那里)。任何帮助将不胜感激。

感谢。

ItemCardsViewModel.cs

// INotifyPropertyChanged implemented on BaseViewModel
public class ItemCardsViewModel : BaseViewModel
{
    public ObservableCollection<ItemViewModel> Items { get; set; }
    public ICommand RefreshCardsCommand { get; private set; }
    public Action OnItemsChanged { get; internal set; }

    public ItemCardsViewModel()
    {
        (...)
        this.RefreshCardsCommand = new Command(RefreshCards);
    }

    private void RefreshCards(object x)
    {
        this.Items = new ObservableCollection<ItemViewModel>(
            this.Items.Select(x =>
            {
                x.IsVisible = false;
                return x;
            }));

        OnPropertyChanged(nameof(this.Items));

        if (this.OnItemsChanged != null)
            OnItemsChanged();
    }

    (...)
}

ItemCards.xaml.cs

public partial class ItemCards : ContentPage
{
    ItemCardsViewModel ViewModel => ((ItemCardsViewModel)this.BindingContext);

    public ItemCards()
    {
        InitializeComponent();

        foreach (var item in ViewModel.Items)
        {
            var cell = new ItemView { BindingContext = item };
            CardsLayout.Children.Add(cell);
        }
        ViewModel.OnItemsChanged += CardsLayout.ForceLayout;
    }
}

ItemCards.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True" (...)>
    <ContentPage.Content>
        <Grid>
            (...)
            <ScrollView Orientation="Vertical" Padding="0,5,0,5" Grid.Column="0" Grid.Row="2">
                <ScrollView.Content>
                    <local:WrapLayout x:Name="CardsLayout" Spacing="5" HorizontalOptions="Start" VerticalOptions="Start" />
                </ScrollView.Content>
            </ScrollView>
        </Grid>
    </ContentPage.Content>
</ContentPage>
编辑:忘记提及,但我正在使用Prism,因此ViewModel会自动连接到视图。

编辑2:只是对这一个的快速更新......即使我没有在RefreshCards方法上创建一个新的ObservableCollection实例,而是循环遍历记录并逐个设置IsVisible属性,问题仍然存在。还尝试将新的ItemViewModel添加到集合中。总是相同的结果,页面上不会显示任何更改。

0 个答案:

没有答案