Massennachricht hinzugefügt

Optik an die vom Android- und Webclient angepasst
Asynchrone Methoden verbessert
This commit is contained in:
LynJet
2022-07-11 16:01:14 +02:00
parent 6daa1ce73a
commit 410945af20
17 changed files with 929 additions and 171 deletions

View File

@@ -8,6 +8,7 @@ using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
@@ -25,6 +26,7 @@ using ChatController.Utilities;
using ChatController.Utilities.Extensions;
using Application = System.Windows.Forms.Application;
using Button = System.Windows.Controls.Button;
using CheckBox = System.Windows.Controls.CheckBox;
using Cursors = System.Windows.Input.Cursors;
using DataFormats = System.Windows.DataFormats;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
@@ -112,11 +114,17 @@ namespace ChatController
}
}
public ObservableCollection<Contact> ContactList
// ToDo: Hier die ContactDepenencyObject-Klasse benutzen wie im Kalender des BeWoPlaners!
public ObservableSortCollection<ContactDependencyObject> ContactList
{
get
get => _ContactList ?? (_ContactList = new ObservableSortCollection<ContactDependencyObject>());
set
{
return _ContactList == null ? new ObservableCollection<Contact>() : new ObservableCollection<Contact>(_ContactList.OrderByDescending(contact => contact.TimeStamp));
_ContactList = new ObservableSortCollection<ContactDependencyObject>(value);
_ContactList.Sort((x, y) => DateTime.Compare(y.Contact.TimeStamp, x.Contact.TimeStamp));
OnPropertyChanged(nameof(ContactList));
}
}
@@ -124,16 +132,21 @@ namespace ChatController
{
get
{
if(_CurrentContact is null)
if(_CurrentContact is null && Chat?.IsInBroadcastMode == false)
{
return Visibility.Collapsed;
}
return _CurrentContact.IsChatMessageInputGridVisible ? Visibility.Visible : Visibility.Collapsed;
if(false == (Chat?.IsInBroadcastMode ?? false) && !(_CurrentContact is null))
{
return _CurrentContact.IsChatMessageInputGridVisible ? Visibility.Visible : Visibility.Collapsed;
}
return Chat?.IsInBroadcastMode ?? false ? Visibility.Visible : Visibility.Collapsed;
}
}
private List<Contact> _ContactList;
private ObservableSortCollection<ContactDependencyObject> _ContactList;
private bool _ScrollPrueferAktivieren;
@@ -150,19 +163,18 @@ namespace ChatController
public ChatMainControl()
{
InitializeComponent();
_ThreadExceptionImageSource = new BitmapImage(new Uri("pack://application:,,,/ChatController;component/Ressourcen/warning-exclamation-mark.png", UriKind.Absolute));
_ChatMessages = new ObservableCollection<ChatMessage>();
ChatMessages = CollectionViewSource.GetDefaultView(_ChatMessages) as ListCollectionView;
if (!(ChatMessages is null))
{
ChatMessages.CustomSort = new ChatMessageComparer();
}
DataContext = this;
ReloadGruppen.Visibility = Visibility.Collapsed;
}
private void ContainingWindowOnDeactivated(object sender, EventArgs e)
@@ -202,20 +214,27 @@ namespace ChatController
OnPropertyChanged(nameof(Chat));
_ContactList = Chat.AddContacts();
_ContactList = new ObservableSortCollection<ContactDependencyObject>();
foreach(var contact in Chat.AddContacts())
{
ContactList.Add(new ContactDependencyObject(contact));
}
ContactList.Sort((x, y) => DateTime.Compare(y.Contact.TimeStamp, x.Contact.TimeStamp));
OnPropertyChanged(nameof(ContactList));
ReadNewSyncFile();
foreach (var contact in _ContactList)
foreach (var contactDependencyObject in _ContactList)
{
if (_GroupId2DateTime.ContainsKey(contact.GroupId))
if (_GroupId2DateTime.ContainsKey(contactDependencyObject.Contact.GroupId))
{
var isUnread = _GroupId2DateTime[contact.GroupId].IsUnread;
var isUnread = _GroupId2DateTime[contactDependencyObject.Contact.GroupId].IsUnread;
contact.IsNewMessage = isUnread;
contact.HasUnreadMessages = contact.IsNewMessage;
contactDependencyObject.Contact.IsNewMessage = isUnread;
contactDependencyObject.Contact.HasUnreadMessages = contactDependencyObject.Contact.IsNewMessage;
}
}
@@ -230,11 +249,11 @@ namespace ChatController
{
var notificationIcon = Resource.ownchat_favicon;
var contact = _ContactList.FirstOrDefault(a => a.GroupId == pGroupId);
var contact = _ContactList.FirstOrDefault(a => a.Contact.GroupId == pGroupId);
if (contact != null)
{
notificationIcon = Utils.ImageSourceToIcon(contact.Image);
notificationIcon = Utils.ImageSourceToIcon(contact.Contact.Image);
}
var notifyIcon = new NotifyIcon { Icon = notificationIcon, Visible = true, Tag = pMessage };
@@ -255,10 +274,10 @@ namespace ChatController
_ContainingWindow.Activate();
var selectedContact = _ContactList?.FirstOrDefault(f => f?.GroupId == pGroupId);
var selectedContact = _ContactList?.FirstOrDefault(f => f?.Contact.GroupId == pGroupId);
if(selectedContact != null)
{
SelectContact(selectedContact);
SelectContact(selectedContact.Contact);
}
};
@@ -314,9 +333,14 @@ namespace ChatController
private void Clientlist_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(Clientlist?.SelectedItem is Contact selectedContact)
if(Chat.IsInBroadcastMode)
{
SelectContact(selectedContact);
return;
}
if(Clientlist?.SelectedItem is ContactDependencyObject selectedContactDependencyObject)
{
SelectContact(selectedContactDependencyObject.Contact);
}
}
@@ -324,7 +348,7 @@ namespace ChatController
{
try
{
if (pContact == null)
if (pContact is null)
{
return;
}
@@ -346,7 +370,7 @@ namespace ChatController
var currentContact = pContact;
pContact.IsNewMessage = false;
var shouldChangeIcon = _ContactList.Any(contact => contact.IsNewMessage);
var shouldChangeIcon = _ContactList.Any(contact => contact.Contact.IsNewMessage);
if (shouldChangeIcon)
{
ContainingWindow.Icon = Utils.ConvertIconToImageSource(Resource.ownchat_favicon);
@@ -354,9 +378,12 @@ namespace ChatController
CurrentContact = currentContact;
if (Clientlist.Items.Contains(pContact))
foreach(ContactDependencyObject item in Clientlist.Items)
{
Clientlist.SelectedItem = pContact;
if(item.Contact.Equals(pContact))
{
Clientlist.SelectedItem = item;
}
}
_ChatMessages.Clear();
@@ -460,9 +487,9 @@ namespace ChatController
}
}
private void PasteOnClick(object sender, RoutedEventArgs routedEventArgs)
private async void PasteOnClick(object sender, RoutedEventArgs routedEventArgs)
{
Chat.Paste(CurrentContact.GroupId,this);
await Chat.Paste(CurrentContact.GroupId,this);
}
private void CopyOnClick(object sender, RoutedEventArgs routedEventArgs)
@@ -582,7 +609,7 @@ namespace ChatController
}
}
private void MediaButton_OnClick(object sender, RoutedEventArgs e)
private async void MediaButton_OnClick(object sender, RoutedEventArgs e)
{
if(CurrentContact != null)
{
@@ -600,7 +627,7 @@ namespace ChatController
return;
}
if (!string.IsNullOrWhiteSpace(pathToScaledImage))
if (File.Exists(pathToScaledImage))
{
_ChatMessages.AddRangeIfElementsNotIn(Chat.AddNewFile(pathToScaledImage, pathToOriginalImage, CurrentContact.GroupId, GetFirstMessage()));
@@ -610,7 +637,7 @@ namespace ChatController
ChatListBox.ScrollIntoView(currentChatMessage);
Chat.SendFileToContact(CurrentContact, pathToScaledImage,pathToOriginalImage);
await Chat.SendFileToContact(CurrentContact, pathToScaledImage, pathToOriginalImage, Chatbox.Text);
if (!string.IsNullOrWhiteSpace(pathToScaledImage) && !pathToScaledImage.Equals(pathToOriginalImage) && File.Exists(pathToScaledImage))
{
@@ -625,8 +652,14 @@ namespace ChatController
}
}
private void SendButton_OnClick(object sender, RoutedEventArgs e)
private async void SendButton_OnClick(object sender, RoutedEventArgs e)
{
if(Chat.IsInBroadcastMode)
{
SendBroadcastMessage();
return;
}
if(CurrentContact != null && !string.IsNullOrEmpty(Chatbox.Text))
{
var messages2Add = Chat.AddNewMessage(Chatbox.Text, CurrentContact.GroupId, GetFirstMessage());
@@ -639,12 +672,10 @@ namespace ChatController
WpfUtils.ScrollToBottomOfListBox(ChatListBox);
Chat.SendMessage(Chatbox.Text, CurrentContact.GroupId);
await Chat.SendMessage(Chatbox.Text, CurrentContact.GroupId);
Chatbox.Text = string.Empty;
Thread.Sleep(500);
DoSynchro();
}
}
@@ -672,12 +703,15 @@ namespace ChatController
// ChatListBox.Items.MoveCurrentToLast();
// ChatListBox.ScrollIntoView(ChatListBox.Items.CurrentItem);
// Chat.SendMessage(Chatbox.Text, CurrentContact.GroupId);
// Chatbox.Text = string.Empty;
// }
//}
OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
OnPropertyChanged(nameof(IsSendButtonEnabled));
}
catch (Exception ed)
{
@@ -685,6 +719,12 @@ namespace ChatController
}
}
private void Chatbox_OnKeyUpHandler(object sender, KeyEventArgs e)
{
OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
OnPropertyChanged(nameof(IsSendButtonEnabled));
}
public delegate void EmojiiDelegate(Button button);
public event EmojiiDelegate OnEmojii;
@@ -725,20 +765,23 @@ namespace ChatController
ChatMessages.MoveCurrentToFirst();
var currentChatMessage = ChatMessages.CurrentItem;
var selectedContact = (Contact) Clientlist.SelectedItem;
Chat.LoadMoreMessagesAsync(selectedContact, GetFirstMessage(), chatMessages =>
if(!(Clientlist.SelectedItem is null))
{
this.Dispatch(() =>
var selectedContact = ((ContactDependencyObject) Clientlist.SelectedItem).Contact;
Chat.LoadMoreMessagesAsync(selectedContact, GetFirstMessage(), chatMessages =>
{
EndWaiting();
this.Dispatch(() =>
{
EndWaiting();
_ChatMessages.AddRangeIfElementsNotIn(chatMessages);
_ChatMessages.AddRangeIfElementsNotIn(chatMessages);
ChatListBox.ScrollIntoView(currentChatMessage);
ChatListBox.ScrollIntoView(currentChatMessage);
});
});
});
}
}
}
}
@@ -782,19 +825,25 @@ namespace ChatController
{
foreach (var newContact in updatedContacts)
{
if (contact.GroupId == newContact.GroupId)
if (contact.Contact.GroupId == newContact.GroupId)
{
// ReceivedMessage kann null sein!
if (contact.ReceivedMessage != null && !contact.ReceivedMessage.Id.Equals(newContact.ReceivedMessage?.Id))
if (contact.Contact.ReceivedMessage != null && !contact.Contact.ReceivedMessage.Id.Equals(newContact.ReceivedMessage?.Id))
{
contact.ReceivedMessage = newContact.ReceivedMessage;
contact.TimeStamp = newContact.TimeStamp;
contact.Contact.ReceivedMessage = newContact.ReceivedMessage;
contact.Contact.TimeStamp = newContact.TimeStamp;
Contact selectedContact = null;
if(Clientlist.SelectedItem is ContactDependencyObject selectedContactDependencyObject)
{
selectedContact = selectedContactDependencyObject.Contact;
}
var selectedContact = (Contact)Clientlist.SelectedItem;
// Angemeldeter Benutzer
var userOid = Chat.ChatDaten.LoggedInUser.Response.User.Oid;
var senderId = contact.ReceivedMessage?.UserId;
var senderId = contact.Contact.ReceivedMessage?.UserId;
var receiverId = userOid;
var receiverGroupId = newContact.GroupId;
var selectedGroupId = selectedContact?.GroupId;
@@ -812,18 +861,18 @@ namespace ChatController
// Wenn der momentan ausgewählte Kontakt der aktuelle Kontakt in der Schleife ist, werden die Nachrichten nicht als ungelesen angezeigt, sonst schon.
if (CurrentContact != null && newContact.GroupId == CurrentContact.GroupId)
{
contact.HasUnreadMessages = false;
contact.Contact.HasUnreadMessages = false;
}
else
{
contact.HasUnreadMessages = true;
contact.IsNewMessage = true;
contact.Contact.HasUnreadMessages = true;
contact.Contact.IsNewMessage = true;
}
}
}
}
if (!updatedContacts.Contains(contact))
if (!updatedContacts.Contains(contact.Contact))
{
_ContactList.ToList().Remove(contact);
}
@@ -853,7 +902,7 @@ namespace ChatController
private void ListenForMessagesForCurrentContact(Contact pCurrentContact)
{
if (!ShouldInterruptContactsThread)
if (!ShouldInterruptContactsThread && !(CurrentContact is null))
{
Chat.CheckIfNewMessagesExistAsync(CurrentContact.GroupId, hasNewMessages =>
{
@@ -888,7 +937,12 @@ namespace ChatController
return true;
}
return (item as Contact).Name.IndexOf(Suche.Text, StringComparison.OrdinalIgnoreCase) >= 0;
if(item is ContactDependencyObject contactDependencyObject)
{
return contactDependencyObject.Contact.Name.IndexOf(Suche.Text, StringComparison.OrdinalIgnoreCase) >= 0;
}
return false;
}
private void Chat_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
@@ -1021,7 +1075,13 @@ namespace ChatController
{
this.Dispatch(() =>
{
_ContactList = Chat.UpdateContacts(data); // <- dauert eine Sekunde!
ContactList = new ObservableSortCollection<ContactDependencyObject>();
foreach(var contact in Chat.UpdateContacts(data))// <- dauert eine Sekunde!
{
ContactList.Add(new ContactDependencyObject(contact));
}
ContactList.Sort((x, y) => DateTime.Compare(y.Contact.TimeStamp, x.Contact.TimeStamp));
OnPropertyChanged(nameof(ContactList));
ReadNewSyncFile();
@@ -1054,9 +1114,9 @@ namespace ChatController
{
Encoding enc = new UTF8Encoding();
foreach (var contact in _ContactList.ToList().Where(contact => contact.ReceivedMessage != null))
foreach (var contact in _ContactList.ToList().Where(contact => contact.Contact.ReceivedMessage != null))
{
var text = contact.GroupId + ";" + contact.TimeStamp.ToUniversalTime() + ";" + contact.IsNewMessage + ";";
var text = contact.Contact.GroupId + ";" + contact.Contact.TimeStamp.ToUniversalTime() + ";" + contact.Contact.IsNewMessage + ";";
var bytes = enc.GetBytes(text);
var base64String = Convert.ToBase64String(bytes);
@@ -1066,7 +1126,7 @@ namespace ChatController
File.SetAttributes(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name), FileAttributes.ReadOnly);
}
}
catch (Exception exception)
catch (Exception)
{
}
@@ -1113,7 +1173,7 @@ namespace ChatController
Chat.LastTimeStamp = latestDateTime.GetUnixTimeStamp();
}
}
catch (Exception e)
catch(Exception)
{
}
@@ -1128,9 +1188,9 @@ namespace ChatController
foreach(var contactItem in Clientlist.Items)
{
if(contactItem is Contact contact && contact.HasUnreadMessages && !string.IsNullOrEmpty(contact.ReceivedMessage?.Text))
if(contactItem is ContactDependencyObject contactDependencyObject && contactDependencyObject.Contact.HasUnreadMessages && !string.IsNullOrEmpty(contactDependencyObject.Contact.ReceivedMessage?.Text))
{
contacts.Add(contact);
contacts.Add(contactDependencyObject.Contact);
}
}
@@ -1146,9 +1206,9 @@ namespace ChatController
{
foreach(var groupId2DateTime in pGroupId2DateTime)
{
if(contact.GroupId == groupId2DateTime.Key)
if(contact.Contact.GroupId == groupId2DateTime.Key)
{
contact.HasUnreadMessages = false;
contact.Contact.HasUnreadMessages = false;
}
}
}
@@ -1195,9 +1255,9 @@ namespace ChatController
File.Delete(file);
}
}
catch (Exception e)
catch (Exception)
{
//ignore
//ignore okeee
}
}
}
@@ -1227,6 +1287,9 @@ namespace ChatController
{
Chatbox.Height = 25;
}
OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
OnPropertyChanged(nameof(IsSendButtonEnabled));
}
public void AddMessages(List<ChatMessage> newMessages)
@@ -1238,5 +1301,272 @@ namespace ChatController
{
return _ChatMessages.FirstOrDefault();
}
#region Broadcast
public bool IsSendButtonEnabled => !string.IsNullOrEmpty(Chatbox.Text);
public bool IsBroadcastButtonEnabled
{
get
{
var isInBroadcastMode = Chat.IsInBroadcastMode;
var hasSelectedContacts = GetSelectedContacts().Any();
var hasTextOrFile = !string.IsNullOrEmpty(Chatbox.Text) || !(BroadcastMessage?.BroadcastMessageImageSource is null);
return isInBroadcastMode && hasSelectedContacts && hasTextOrFile;
}
}
private Contact _PreviousContact;
private CancellationTokenSource _CancellationTokenSource;
private string _DefaultBroadcastInfoText = "Dies ist eine Nachricht, die als Broadcast an alle ausgewählten Kontakte geschickt wird.";
private string _BroadcastInfoText;
public string BroadcastInfoText
{
get => _BroadcastInfoText ?? (_BroadcastInfoText = _DefaultBroadcastInfoText);
set
{
_BroadcastInfoText = $"{_DefaultBroadcastInfoText}{Environment.NewLine}{value}";
OnPropertyChanged(BroadcastInfoText);
}
}
private double _BroadcastProgressValue;
public double BroadcastProgressValue
{
get => _BroadcastProgressValue;
set
{
_BroadcastProgressValue = value;
OnPropertyChanged(nameof(BroadcastProgressValue));
}
}
private BroadcastMessage _BroadcastMessage;
public BroadcastMessage BroadcastMessage
{
get => _BroadcastMessage;
set
{
_BroadcastMessage = value;
OnPropertyChanged(nameof(BroadcastMessage));
OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
}
}
private void BroadcastButton_OnClick(object sender, RoutedEventArgs e)
{
Chat.IsInBroadcastMode = !Chat.IsInBroadcastMode;
BroadcastProgressValue = 0;
DeselectAllContacts();
if (Chat.IsInBroadcastMode)
{
_CancellationTokenSource = new CancellationTokenSource();
_PreviousContact = CurrentContact;
CurrentContact = null;
}
else
{
CloseBroadcastMode();
}
OnPropertyChanged(nameof(IsSendButtonEnabled));
OnPropertyChanged(nameof(ChatMessageInputGridVisibility));
OnPropertyChanged(nameof(BroadcastMessage));
}
private void AbortBroadcastButton_OnClick(object sender, RoutedEventArgs e)
{
CloseBroadcastMode();
}
private async void SendBroadcastMessage()
{
var selectedContacts = GetSelectedContacts();
if (selectedContacts.Count == 0 || string.IsNullOrEmpty(Chatbox.Text) && BroadcastMessage.BroadcastMessageImageSource is null)
{
return;
}
var progress = new Progress<BroadcastProgressReportModel>();
progress.ProgressChanged += ReportProgress;
try
{
await SendBroadcast(progress, _CancellationTokenSource.Token);
}
catch(OperationCanceledException)
{
BroadcastInfoText = "Der Broadcast wurde abgebrochen.";
}
DoSynchro();
CloseBroadcastMode();
}
private async Task SendBroadcast(IProgress<BroadcastProgressReportModel> progress, CancellationToken cancellationToken)
{
var count = 0;
var report = new BroadcastProgressReportModel();
var selectedContacts = GetSelectedContacts();
foreach (var contact in selectedContacts.Where(selectedContact => selectedContact.IsChatMessageInputGridVisible))
{
if(BroadcastMessage is null)
{
await Chat.SendMessage(Chatbox.Text, contact.GroupId);
}
else
{
await Chat.SendFileToContact(contact, BroadcastMessage.ScaledFilePath, BroadcastMessage.OriginalFilePath, Chatbox.Text);
}
cancellationToken.ThrowIfCancellationRequested();
count++;
report.PercentageComplete = count * 100 / selectedContacts.Count;
progress.Report(report);
}
}
private void ReportProgress(object sender, BroadcastProgressReportModel e)
{
BroadcastProgressValue = e.PercentageComplete;
}
private void SelectAllContacts_OnClick(object sender, RoutedEventArgs e)
{
if(sender is CheckBox checkBox)
{
var isChecked = checkBox.IsChecked ?? false;
foreach (var contactDependencyObject in ContactList)
{
contactDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, isChecked);
}
OnPropertyChanged(nameof(ContactList));
OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
}
}
private void SendBroatcastButton_OnClick(object sender, RoutedEventArgs e)
{
SendBroadcastMessage();
}
private void CancelBroadcastButton_OnClick(object sender, RoutedEventArgs e)
{
_CancellationTokenSource?.Cancel();
BroadcastMessage = null;
Chatbox.Text = string.Empty;
}
private void AddMediaFileToBroadcastMessage_OnClick(object sender, RoutedEventArgs e)
{
if(Chat.IsInBroadcastMode)
{
var originalFilePath = Chat.OpenFile();
if(File.Exists(originalFilePath))
{
var scaledImagePath = FileUtils.ScaleImage(originalFilePath, Path.GetExtension(originalFilePath.ToUpperInvariant()), Chat.ChatDaten.MaxUploadSize);
var isFileSizeTooLarge = FileUtils.CheckFileSize(scaledImagePath, Chat.ChatDaten.MaxUploadSize);
if(isFileSizeTooLarge)
{
MessageBox.Show($"Die ausgewählte Datei ist zu groß. Die maximale Größe beträgt {Chat.ChatDaten.MaxUploadSize / 1000 / 1000} MB", "Senden nicht möglich", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if(File.Exists(scaledImagePath))
{
if (BroadcastMessage is null)
{
BroadcastMessage = new BroadcastMessage(originalFilePath, scaledImagePath);
}
}
}
}
}
private void CloseBroadcastMode()
{
Chatbox.Text = string.Empty;
if(!(_PreviousContact is null))
{
SelectContact(_PreviousContact);
}
_CancellationTokenSource = null;
BroadcastMessage = null;
BroadcastProgressValue = 0;
DeselectAllContacts();
OnPropertyChanged(nameof(IsSendButtonEnabled));
OnPropertyChanged(nameof(ChatMessageInputGridVisibility));
OnPropertyChanged(nameof(BroadcastMessage));
Chat.IsInBroadcastMode = false;
}
#endregion
private void ContactCheckBox_OnClick(object sender, RoutedEventArgs e)
{
OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
}
private void ContactCheckBox_OnChecked(object sender, RoutedEventArgs e)
{
UpdateContactSelection();
}
private void UpdateContactSelection()
{
OnPropertyChanged(nameof(ContactList));
OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
SelectAllContactsCheckBox.IsChecked = GetSelectedContacts().Count == ContactList.Where(contactDependencyObject => contactDependencyObject.Contact.IsChatMessageInputGridVisible).ToList().Count;
}
private List<Contact> GetSelectedContacts()
{
var result = new List<Contact>();
foreach(var contactDependencyObject in ContactList.Where(contactDependencyObject => contactDependencyObject.Contact.IsChatMessageInputGridVisible))
{
if(contactDependencyObject.GetValue(ListItemHelper.IsCheckedProperty) is bool isChecked && isChecked)
{
result.AddIfNotIn(contactDependencyObject.Contact);
}
}
return result;
}
private void DeselectAllContacts()
{
foreach (var contactDependencyObject in ContactList)
{
contactDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, false);
}
}
}
}