Когда я переключаюсь на другой источник в ListView, он не обновляется - PullRequest
0 голосов
/ 26 апреля 2018

Я новичок в Xamarin, и я пытаюсь переключить Список. Поэтому, когда кнопка нажата, она переключается на другой список. У меня есть класс CustomLists, который оборачивает все эти списки и предоставляет свойство ChosenList, которое дает доступ к списку, отображаемому в данный момент. Когда запись в Списке удалена, свойство Command вызывается

public ICommand DeleteTest
{
    get { return new Command<TaskRecord>((s) => OnDelete(s)); }
}
void OnDelete(TaskRecord task)
{
    List.Remove(task);
    IsUnfinishedChanged_ = !task.IsFinished;
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ChosenList"));
    System.Diagnostics.Debug.Print("Deleting..");
}

Когда я удаляю запись в первом списке (показанном при запуске программы), он работает нормально. Но через секунду ListView по какой-то причине не обновляется

Вот мой код XAML

 <ListView ItemsSource="{Binding ChosenList}" IsPullToRefreshEnabled="True" 
          Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2" SeparatorColor="DimGray">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ViewCell.ContextActions>
                    <MenuItem Text="Delete" IsDestructive="true"  
                               Command="{Binding Source={x:Reference MainGrid}, 
                        Path=BindingContext.DeleteTest}" 
                              CommandParameter="{Binding .}"/>
                </ViewCell.ContextActions>
                <StackLayout Padding="15,0" VerticalOptions="Center">
                    <Label Text="{Binding Path=Name}" FontSize="Large" Font="Arial"
                           FontAttributes="Bold" VerticalOptions="Center"/>
                    <Label Text="{Binding Path=ShortDescr}" FontSize="Micro" Font="Arial"
                           VerticalOptions="Center"/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Редактировать: ChosenList является оберткой для ListView для привязки к

public List<TaskRecord> ChosenList
{
    get
    {
        return (IsAll_ ? List : Unfinished);
    }
}

Редактировать 2: Размещение всего кода здесь

private List<TaskRecord> List { get; set; }
private List<TaskRecord> UnfinishedCache_;
private List<TaskRecord> Unfinished
{
    get
    {
        if (IsUnfinishedChanged_)
        {
            UnfinishedCache_ = new List<TaskRecord>();
            foreach (TaskRecord task in List)
            {
                if (!task.IsFinished) UnfinishedCache_.Add(task);
            }
            IsUnfinishedChanged_ = false;
        }
        return UnfinishedCache_;
    }
    set { UnfinishedCache_ = value; }
}

private bool IsUnfinishedChanged_=true;
private bool IsAll_;

public ICommand ListChangeCommand
{
    get { return new Command<string>((s)=>OnListSwitch(s)); }
}
void OnListSwitch(string senderText)
{
    if (senderText == "All" && !IsAll_)
    {
        IsAll_ = true;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ChosenList"));
    }
    else if (senderText == "Unfinished" && IsAll_)
    {
        IsAll_ = false;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ChosenList"));
    }
}

public ICommand DeleteTest
{
    get { return new Command<TaskRecord>((s) => OnDelete(s)); }
}
void OnDelete(TaskRecord task)
{
    List.Remove(task);
    IsUnfinishedChanged_ = !task.IsFinished;
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ChosenList"));
    System.Diagnostics.Debug.Print("Deleting..");
}

public event PropertyChangedEventHandler PropertyChanged;
public List<TaskRecord> ChosenList
{
    get
    {
        return (IsAll_ ? List : Unfinished);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...