Я пытаюсь создать приложение чата в xamarin.forms. Для остальных экранов я не использую шаблон MVVM. Но я пытаюсь реализовать шаблон MVVM в части чата. Таким образом, в основном мой вид чата представляет собой просмотр списка с шаблоном входящих и исходящих сообщений. Я попытаюсь вызвать API в моей модели представления и попытаться связать результат с представлением. Я могу получить значение из API, но не могу связать его с просмотром .
Чтобы получить результат API, мне нужно передать уникальный идентификатор, извлеченный из предыдущей страницы, когда пользователь нажимает на опцию чата. Поэтому у меня есть два сомнения.
- Как я сказал, что я не использую шаблон MVVM, я передаю уникальный идентификатор с предыдущей страницы в модель просмотра страницы чата через центр сообщений. Это правильный способ передачи значения из одного кода в другую модель просмотра страницы?
- Сообщение не привязывается к пользовательскому интерфейсу.
Моя viewmodel
public class ChatPageViewModel : INotifyPropertyChanged
{
public INavigation Navigation { get; set; }
public ObservableCollection<NCMessage> Messages { get; set; } = new ObservableCollection<NCMessage>();
public string TextToSend { get; set; }
ObservableCollection<ChatData> ChatListObj;
public ICommand OnSendCommand { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public ChatPageViewModel(INavigation navigation)
{
MessagingCenter.Subscribe<MyMessage>(this, "ChatClicked", async (value) =>
{
string receivedData = value.Myvalue;
await loadChatList(value.Myvalue);
});
OnSendCommand = new Command(() =>
{
if (!string.IsNullOrEmpty(TextToSend))
{
var urlStr = TextToSend;
var message = new NCMessage
{
Text = urlStr.ToString(),
IsIncoming = false,
MessageDateTime = DateTime.Now
};
Messages.Add(message);
TextToSend = string.Empty;
}
});
}
// My chatlist API call
public async Task loadChatList(string Type)
{
await Task.Run(() =>
{
try
{
NCAPICall callForNotificationList = new NCAPICall("MyHeader", null, null);
try
{
ChatListObj = callForNotificationList.APICallResult<ObservableCollection<ChatData>>();
if (ChatListObj[0].success)
{
// This value not updating in UI
Messages.Insert(0, new NCMessage() { Text = "Sample msg", IsIncoming = true });
}
}
catch (Exception e)
{
}
}
catch (Exception)
{
}
});
}
}
Если я предоставлю Messages.Insert(0, new NCMessage() { Text = "Sample msg", IsIncoming = true });
непосредственно в viewmodel, он покажет.
My ChatPage.xaml.cs
public partial class ChatPage : ContentPage
{
ChatPageViewModel vm;
public ChatPage(NCDatamodel.Result notificationListData)
{
InitializeComponent();
this.BindingContext = vm = new ChatPageViewModel(Navigation)
}
}
Любая помощь приветствуется.