ListView "Объект ItemsControl не соответствует своему источнику элементов"
Имеется WPF клиент, который принимается данные от SignalR сервера. После запуска формы выдаёт сообщение об ошибке Объект ItemsControl не соответствует своему источнику элементов.
Код list view в который я вывожу отправляемый и получаемый объект
<ListView x:Name="messages" Margin="73,34,73,118" d:LayoutOverrides="HorizontalAlignment" ItemsSource="{Binding Messages}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding User}"/>
<GridViewColumn DisplayMemberBinding="{Binding Message}"/>
</GridView>
</ListView.View>
</ListView>
Класс отвечающий за приём данных
public class MessageData
{
public string Message { get; set; }
public string User { get; set; }
}
Класс осуществляющий работу с SinglaR сервером
class ChatViewModel : INotifyPropertyChanged
{
HubConnection hubConnection;
public string Username { get; set; }
public string Message { get; set; }
public ObservableCollection<MessageData> Messages { get; }
bool isBusy;
public bool IsBusy
{
get => isBusy;
set
{
if (isBusy != value)
{
isBusy = value;
OnPropertyChanged("IsBusy");
}
}
}
bool isConnected;
public bool IsConnected
{
get => isConnected;
set
{
if (isConnected != value)
{
isConnected = value;
OnPropertyChanged("IsConnected");
}
}
}
public Command SendMessageCommand { get; }
public ChatViewModel()
{
hubConnection = new HubConnectionBuilder()
.WithUrl("https://localhost:44316/chat")
.Build();
Messages = new ObservableCollection<MessageData>();
IsConnected = false;
IsBusy = false;
SendMessageCommand = new Command(async o => await SendMessage(), o => IsConnected);
hubConnection.Closed += async (error) =>
{
SendLocalMessage(string.Empty, "Connection closed");
IsConnected = false;
await Task.Delay(5000);
await Connect();
};
hubConnection.On<string, string>("Receive", (user, message) =>
{
SendLocalMessage(user, message);
});
}
public async Task Connect()
{
if (IsConnected)
return;
try
{
await hubConnection.StartAsync();
SendLocalMessage(string.Empty, "Connected in chat");
IsConnected = true;
}
catch (System.Exception ex)
{
SendLocalMessage(string.Empty, $"Connection error: {ex.Message}");
}
}
public async Task Disconnect()
{
if (!IsConnected)
return;
await hubConnection.StopAsync();
IsConnected = false;
SendLocalMessage(string.Empty, "You was disconnect from chat");
}
private void SendLocalMessage(string user, string message)
{
Messages.Insert(0, new MessageData
{
Message = message,
User = user
});
}
async Task SendMessage()
{
try
{
IsBusy = true;
await hubConnection.InvokeAsync("Send", Username, Message);
}
catch (Exception ex)
{
SendLocalMessage(string.Empty, $"Exception error: {ex.Message}");
}
finally
{
IsBusy = false;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
public class Command : ICommand
{
private Action<object> execute;
private Func<object, bool> canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public Command(Action<object> execute, Func<object, bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return this.canExecute == null || this.canExecute(parameter);
}
public void Execute(object parameter)
{
execute(parameter);
}
}