我有一個新的 Xamarin Forms 5 應用程式,但我遇到了資料系結問題。
首先,我顯示一條訊息,告訴用戶他的串列中有多少專案。最初,這是 0。它由DisplayMessage視圖模型的屬性顯示。
然后,該Init()方法被呼叫,一旦 API 呼叫完成,在MyList. 我設定了斷點以確保 API 呼叫正常作業,并最終在MyList屬性中得到一些資料。
message因為我在我的方法中更改了 的值Init(),所以我希望訊息會更改并顯示串列中的專案數,但即使我在MyList.
我創建了一個新的 ViewModel,如下所示:
public class MyViewModel : BaseViewModel
{
public List<MyItem> MyList { get; set; } = new List<MyItem>();
string message = "You have no items in your list... ";
public string DisplayMessage
{
get => message;
set
{
if(message == value)
return;
message = value;
OnPropertyChanged();
}
}
public async void Init()
{
var data = await _myService.GetData();
if(data.Count > 0)
message = $"You have {data.Count} items in your list!";
MyList = data;
}
}
我MainPage背后的代碼如下所示:
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MainPage : ContentPage
{
MyViewModel _vm;
MainPage()
{
InitializeComponent();
_vm = new MyViewModel();
this.BindingContext = _vm;
}
protected override void OnAppearing()
{
base.OnAppearing();
_vm.Init();
}
}
我沒有更改基本視圖模型中的任何內容,只是添加了我的服務,它看起來像這樣:
public class BaseViewModel : INotifyPropertyChanged
{
public IMyApiService MyApi => DependencyService.Get<IMyApiService>();
bool isBusy = false;
public bool IsBusy
{
get { return isBusy; }
set { SetProperty(ref isBusy, value); }
}
string title = string.Empty;
public string Title
{
get { return title; }
set { SetProperty(ref title, value); }
}
protected bool SetProperty<T>(ref T backingStore, T value,
[CallerMemberName] string propertyName = "",
Action onChanged = null)
{
if (EqualityComparer<T>.Default.Equals(backingStore, value))
return false;
backingStore = value;
onChanged?.Invoke();
OnPropertyChanged(propertyName);
return true;
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
var changed = PropertyChanged;
if (changed == null)
return;
changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
我很感激有人告訴我我的錯誤在哪里。謝謝。
uj5u.com熱心網友回復:
如果沒有看到 Xaml,我無法 100% 回答,但我看到了以下幾點:
- 您正在通過欄位而不是屬性設定“訊息”。由于您直接設定欄位,因此不會觸發 OnPropertyChanged 事件,因此 UI 不會收到值已更改的通知。
- 我猜你正在將“MyList”系結到某種 CollectionView 或其他東西?如果它是只讀視圖,則可以使用串列,因為集合永遠不會更新。但是,如果您計劃在運行時添加或洗掉專案,它需要是“ObservableCollection”,原因與上述相同,UI 不會通知 List 中的新專案,但 ObservableCollection 會通知 UI 更改到它,所以它可以更新。
- 是杰森在他的評論中提到的。MyList 屬性應該像其他屬性一樣使用 OnPropertyChanged 進行設定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434018.html
