Значение формы Xamarin не привязывается к пользовательскому интерфейсу из viewmodel - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь создать приложение чата в xamarin.forms. Для остальных экранов я не использую шаблон MVVM. Но я пытаюсь реализовать шаблон MVVM в части чата. Таким образом, в основном мой вид чата представляет собой просмотр списка с шаблоном входящих и исходящих сообщений. Я попытаюсь вызвать API в моей модели представления и попытаться связать результат с представлением. Я могу получить значение из API, но не могу связать его с просмотром .

Чтобы получить результат API, мне нужно передать уникальный идентификатор, извлеченный из предыдущей страницы, когда пользователь нажимает на опцию чата. Поэтому у меня есть два сомнения.

  1. Как я сказал, что я не использую шаблон MVVM, я передаю уникальный идентификатор с предыдущей страницы в модель просмотра страницы чата через центр сообщений. Это правильный способ передачи значения из одного кода в другую модель просмотра страницы?
  2. Сообщение не привязывается к пользовательскому интерфейсу.

Моя 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)           
        }    
    }

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 марта 2020

Быстрый и грязный подход состоит в том, чтобы установить свойство publi c в вашей ViewModel из конструктора ChatPage. Затем вы можете переопределить OnAppearing в ChatPage и вызвать loadChatList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...