簡體   English   中英

綁定到 ViewModel 在 Xamarin.Forms 中不起作用

[英]Binding to the ViewModel not working in Xamarin.Forms

我正在嘗試制作一個顯示國家列表的應用程序,當單擊一個國家/地區時,它會顯示該國家/地區的城市列表。

國家.cs:

public class Country {
  public string Name { get; set; }
  public ImageSource Image { get; set; }
  public IList<City> Cities { get; set; }
}

城市.cs:

public class City
{
    public string Name { get; set; }
}

通過以下方式在 CountryPageViewModel.cs 中執行導航:

async void OnSelectedCountry(Country country)
    {
        if (country == null)
        {
            return;
        }

        await Shell.Current.GoToAsync($"{nameof(CitiesPage)}?{nameof(CitiesViewModel.Name)}={country.Name}");
    }

城市被加載到 CitiesViewModel.cs 中:

[QueryProperty(nameof(Name), nameof(Name))]
public class CitiesViewModel : BaseViewModel
{
    private string countryName;

    public IList<City> CityList { get; set; }

    public string Name
    {
        get
        {
            return countryName;
        }

        set
        {
            countryName = value;
            LoadCities(value);
        }
    }

    public async void LoadCities(string countryName)
    {
        try
        {
            Country country = await DataStore.GetItemAsync(cityName);
            IList<City> cities = country.Cities;
            CityList = cities;
        }
        catch (Exception)
        {
            Console.WriteLine("Impossible to load cities");
        }
    }
}

在 XAML (CitiesPage.xaml) 中:

<CollectionView x:Name="citiesCollectionView"  x:DataType="viewmodels:CitiesViewModel"
            ItemsSource="{Binding CityList}"
            EmptyView="Impossible to load cities" >
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid Padding="5" x:DataType="models:City">
                <Frame Style="{StaticResource CityCard}">
                    <Grid RowDefinitions="Auto,Auto"
                          ColumnDefinitions="Auto" >
                        <Label Grid.Column="1" 
                            Text="{Binding Name}" 
                            FontAttributes="Bold"
                            VerticalTextAlignment="Center"
                            Padding="10"
                            HeightRequest="50" />
                    </Grid>
                </Frame>
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

但是“城市”頁面中沒有顯示任何內容。 我已將 CitiesPage.xaml.cs(代碼隱藏)中的 BindingContext 設置為 ViewModel。

我究竟做錯了什么?

對於誰可能有同樣的問題,正如 xamarin 文件所說

視圖可訪問的所有視圖 model 和 model 類都應實現 INotifyPropertyChanged 接口。 Implementing this interface in a view model or model class allows the class to provide change notifications to any data-bound controls in the view when the underlying property value changes.

以下是有關PropertyChanged 的更多提示:

- 如果公共屬性的值發生變化,則始終引發 PropertyChanged 事件。 不要因為知道 XAML 綁定是如何發生的而假設可以忽略引發 PropertyChanged 事件。

始終為視圖 model 或 model 中的其他屬性使用其值的任何計算屬性引發 PropertyChanged 事件。

始終在進行屬性更改的方法結束時引發 PropertyChanged 事件,或者當已知 object 位於安全 state 中時。 引發事件會通過同步調用事件的處理程序來中斷操作。 如果這發生在操作中間,當 object 處於不安全、部分更新的 state 中時,它可能會將 object 暴露給回調函數。 此外,PropertyChanged 事件可能會觸發級聯更改。 級聯更改通常需要在級聯更改可以安全執行之前完成更新。

如果屬性未更改,則永遠不要引發 PropertyChanged 事件。 這意味着您必須在引發 PropertyChanged 事件之前比較舊值和新值。

如果您正在初始化屬性,則永遠不要在視圖模型的構造函數期間引發 PropertyChanged 事件。 此時視圖中的數據綁定控件將不會訂閱接收更改通知。

在 class 的公共方法的單個同步調用中,絕不會引發多個具有相同屬性名稱參數的 PropertyChanged 事件。 例如,給定一個 NumberOfItems 屬性,其后備存儲是 _numberOfItems 字段,如果一個方法在循環執行期間將 _numberOfItems 遞增 50 次,則在所有工作完成后,它應該只在 NumberOfItems 屬性上引發一次屬性更改通知。 對於異步方法,在異步延續鏈的每個同步段中為給定屬性名稱引發 PropertyChanged 事件。

暫無
暫無

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

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