簡體   English   中英

Xamarin.forms MVVM。 Listview保持為空

[英]Xamarin.forms MVVM. Listview remains empty

我是Xamarin.Forms和MVVM的新手,並在StackOverflow上發布了問題,請耐心等待。 我正在嘗試在Xamarin.Forms中填充列表視圖。 我首先在沒有MVVM的情況下對其進行了編程,並且一切都按我想要的方式工作,但是現在我想進入MVVM,這就是問題所在,現在我的列表不再填寫了。 我創建了一個視圖模型,僅將所有綁定放入該視圖模型中,但尚未實現事件處理程序。

這是背后代碼的一部分(我還有幾個事件處理程序,但現在不相關了):

    namespace CCXamarinApp
    {
        [XamlCompilation(XamlCompilationOptions.Compile)]
        public partial class PatientsWithTagPage : ContentPage
        {
            public PatientsWithTagPage()
            {
                BindingContext = new PatientsWithTagViewModel();

                InitializeComponent();
                (BindingContext as PatientsWithTagViewModel).GetAllPatients();

                if((BindingContext as PatientsWithTagViewModel).IsEmptyPatientList)
                    HandleEmptyList();
                else
                    (BindingContext as PatientsWithTagViewModel).SortAndShowPatients();
            }

            private void SearchBar_OnTextChanged(object sender, TextChangedEventArgs e)
            {
            (BindingContext as PatientsWithTagViewModel).Searching(e.NewTextValue);
            }
           ...

這是我的XAML頁面

        <SearchBar x:Name="SearchBar" Placeholder="Zoek op naam of plaats..." HeightRequest="25" Margin="10"
                TextChanged="SearchBar_OnTextChanged"/>

        <Label Text="{Binding LastRefreshed}" FontAttributes="Italic" FontSize="15" />

        <Label x:Name="LabelEmptyList" FontSize="17" Text="Geen gegevens gevonden" FontAttributes="Bold"
                IsVisible="False" />

        <ListView x:Name="PatientListView" HasUnevenRows="True" SeparatorColor="Accent"
                VerticalOptions="FillAndExpand" IsPullToRefreshEnabled="True" IsRefreshing="{Binding IsFetchingData, Mode=TwoWay}"
                Refreshing="PatientListView_OnRefreshing" SelectedItem="{Binding SelectedPatient, Mode=TwoWay}"
                ItemSelected="PatientListView_OnItemSelected" ItemsSource="{Binding Patients}"
                  IsVisible="True" BackgroundColor="Aqua">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Spacing="4">
                            <StackLayout Orientation="Horizontal" Margin="10,7,10,1">
                                <Label Text="{Binding FullName}" FontAttributes="Bold" FontSize="16" />
                                <Label Text="{Binding DisplayTimeOfLastScan, StringFormat='{0}'}"
                                        HorizontalOptions="EndAndExpand" />
                            </StackLayout>
                            <StackLayout Orientation="Horizontal" Margin="10,0,10,7">
                                <Label Text="{Binding LastLocation}" HorizontalOptions="Start" />
                                <Label Text="{Binding DisplayDurationSinceLastScan, StringFormat='al {0}'}"
                                        HorizontalOptions="EndAndExpand" />
                            </StackLayout>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

這是我的視圖模型 (不是所有代碼,而是最相關的代碼)。 它派生自的BaseViewModel來自nuget包“ Refractored.Mvvmhelpers”:

class PatientsWithTagViewModel : BaseViewModel
    {
    public ObservableCollection<PatientViewModel> Patients { get; private set; } = new ObservableCollection<PatientViewModel>();

    private PatientViewModel selectedPatient;
    public PatientViewModel SelectedPatient
    {
        get => selectedPatient;
        set => SetProperty(ref selectedPatient, value);
    }

    private readonly JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings
    {
        DateFormatString = "dd-MM-yyyTH:mm",
        DateTimeZoneHandling = DateTimeZoneHandling.Utc,
    };

    public bool IsEmptyPatientList => Patients.Count == 0;

    private string testJson = "[{\"firstName\":\"P.\",\"lastName\":\"Selie\",\"tag\":{\"tagId\":\"124\",\"tagSerialNumber\":\"ABC135\"},\"scans\":[{\"location\":\"Tuin\",\"dateTime\":\"May01,2018,10:10\"},{\"location\":\"Eetzaal\",\"dateTime\":\"May02,2018,10:15\"},{\"location\":\"Gang\",\"dateTime\":\"May02,2018,11:10\"},{\"location\":\"Kamer23\",\"dateTime\":\"May02,2018,12:09\"}],\"id\":\"dcc4fe9929b3681f\"}," +
                              "{\"firstName\":\"W.\",\"lastName\":\"Janssens\",\"tag\":{\"tagId\":\"132\",\"tagSerialNumber\":\"ABC167\"},\"scans\":[{\"location\":\"Kamer23\",\"dateTime\":\"May01,2018,23:39\"},{\"location\":\"Gang\",\"dateTime\":\"May02,2018,04:10\"},{\"location\":\"Eetzaal\",\"dateTime\":\"May02,2018,04:11\"},{\"location\":\"Gang\",\"dateTime\":\"May02,2018,04:20\"},{\"location\":\"Kamer23\",\"dateTime\":\"May02,2018,04:22\"}],\"id\":\"a6dac28475327922\"}]";

    public void GetAllPatients()
    {
        IsFetchingData = true;
        try
        {
            Patients = new ObservableCollection<PatientViewModel>(
                JsonConvert.DeserializeObject<ObservableCollection<PatientViewModel>>(testJson,
                    jsonSerializerSettings));
        }
        catch(Exception e)
        {
            Console.WriteLine("*****ERROR kon API niet ophalen");
            Console.WriteLine(e.Message);
        }
        finally
        {
            IsFetchingData = false;
        }
    }

這是我使用的模型

public class Patient : ObservableObject
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Tag Tag { get; set; }
        public List<Scan> Scans { get; set; }
        public string Id { get; set; }

        public override string ToString()
        {
            return LastName + ", " + FirstName;
        }

    }

它還具有自己的viewmodel ,具有諸如DisplayDurationSinceLastScan屬性,但我認為它在這里不相關,如果您認為與此相關,請告訴我。

因此,使用此代碼,我得到了我的頁面,但是列表中似乎沒有任何項目,如果我進行調試,患者中充滿了項目,因此它根本不是空的,但是綁定出了點問題,我想但是沒有給出錯誤。

這是我得到的圖片:顯示了列表視圖(我添加了藍色背景,所以我會知道列表視圖是否可見),但是其中沒有任何項目。 當我調試應用程序時,仍然充滿病人。

有人看到我犯的錯誤嗎?

從可維護性的角度來看,我在這里看到了代碼的一些問題。 嘗試將所有代碼都保留在視圖模型中,而不要同時保留視圖模型和代碼。 理想情況下,您后面的代碼不包含任何內容,如果有的話,則與視覺事物嚴格相關。

無論如何,關於您的問題:您每次都創建一個新的ObservableCollection 這打破了綁定。 只需將新的ObservableCollection保留在頂部,然后在輸入新數據時,將其清除並重新填充。 像這樣:

public void GetAllPatients()
{
    IsFetchingData = true;
    try
    {
        var resultPatients =         JsonConvert.DeserializeObject<ObservableCollection<PatientViewModel>>(testJson, jsonSerializerSettings);

        Patients.Clear(); 

        foreach (var patient in resultPatients)
            Patients.Add(patient);
    }
    catch(Exception e)
    {
        Console.WriteLine("*****ERROR kon API niet ophalen");
        Console.WriteLine(e.Message);
    }
    finally
    {
        IsFetchingData = false;
    }
}

您的數據現在應該顯示出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM