Skip to content

Commit 1672521

Browse files
UI: fix threading exception on txtFilter access
1 parent 8451573 commit 1672521

File tree

1 file changed

+45
-42
lines changed

1 file changed

+45
-42
lines changed

src/Certify.UI.Shared/Controls/ManagedCertificates.xaml.cs

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -54,50 +54,53 @@ private void AppViewModel_PropertyChanged(object sender, PropertyChangedEventArg
5454

5555
private void SetFilter()
5656
{
57-
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).Filter = (item) =>
57+
Dispatcher.Invoke(() =>
5858
{
59-
var filter = txtFilter.Text.Trim();
60-
var matchItem = item as Models.ManagedCertificate;
61-
62-
return filter == "" || filter.Split(';').Where(f => f.Trim() != "").Any(f =>
63-
64-
// match on a specific status filter
65-
(f == "[Status=Error]" && matchItem.Health == Models.ManagedCertificateHealth.Error) ||
66-
(f == "[Status=OK]" && matchItem.Health == Models.ManagedCertificateHealth.OK) ||
67-
(f == "[Status=Warning]" && matchItem.Health == Models.ManagedCertificateHealth.Warning) ||
68-
(f == "[Status=AwaitingUser]" && matchItem.Health == Models.ManagedCertificateHealth.AwaitingUser) ||
69-
(f == "[Status=InvalidConfig]" && matchItem.DomainOptions?.Count(d => d.IsPrimaryDomain) > 1) ||
70-
(f == "[Status=NoCertificate]" && matchItem.CertificatePath == null) ||
71-
// match on selected or primary domain options with domain containing keyword
72-
(matchItem.DomainOptions?.Any(d => (d.IsSelected || d.IsPrimaryDomain) && d.Domain.Contains(f, StringComparison.InvariantCultureIgnoreCase)) ?? false) ||
73-
// match on requestconfig primary or san containing keyword
74-
(matchItem.RequestConfig.SubjectAlternativeNames?.Any(d => d.Contains(f, StringComparison.InvariantCultureIgnoreCase)) ?? false) ||
75-
(matchItem.RequestConfig.PrimaryDomain?.Contains(f, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
76-
// match on comments containing keyword
77-
(matchItem.Comments ?? "").Contains(f, StringComparison.InvariantCultureIgnoreCase) ||
78-
// match on name containing keyword
79-
matchItem.Name.Contains(f, StringComparison.InvariantCultureIgnoreCase) ||
80-
// match on ID
81-
matchItem.Id == f
82-
);
83-
};
84-
85-
//sort by name ascending
86-
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).SortDescriptions.Clear();
87-
88-
if (_sortOrder == "NameAsc")
89-
{
90-
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).SortDescriptions.Add(
91-
new System.ComponentModel.SortDescription("Name", System.ComponentModel.ListSortDirection.Ascending)
92-
);
93-
}
59+
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).Filter = (item) =>
60+
{
61+
var filter = txtFilter.Text.Trim();
62+
var matchItem = item as Models.ManagedCertificate;
63+
64+
return filter == "" || filter.Split(';').Where(f => f.Trim() != "").Any(f =>
65+
66+
// match on a specific status filter
67+
(f == "[Status=Error]" && matchItem.Health == Models.ManagedCertificateHealth.Error) ||
68+
(f == "[Status=OK]" && matchItem.Health == Models.ManagedCertificateHealth.OK) ||
69+
(f == "[Status=Warning]" && matchItem.Health == Models.ManagedCertificateHealth.Warning) ||
70+
(f == "[Status=AwaitingUser]" && matchItem.Health == Models.ManagedCertificateHealth.AwaitingUser) ||
71+
(f == "[Status=InvalidConfig]" && matchItem.DomainOptions?.Count(d => d.IsPrimaryDomain) > 1) ||
72+
(f == "[Status=NoCertificate]" && matchItem.CertificatePath == null) ||
73+
// match on selected or primary domain options with domain containing keyword
74+
(matchItem.DomainOptions?.Any(d => (d.IsSelected || d.IsPrimaryDomain) && d.Domain.Contains(f, StringComparison.InvariantCultureIgnoreCase)) ?? false) ||
75+
// match on requestconfig primary or san containing keyword
76+
(matchItem.RequestConfig.SubjectAlternativeNames?.Any(d => d.Contains(f, StringComparison.InvariantCultureIgnoreCase)) ?? false) ||
77+
(matchItem.RequestConfig.PrimaryDomain?.Contains(f, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
78+
// match on comments containing keyword
79+
(matchItem.Comments ?? "").Contains(f, StringComparison.InvariantCultureIgnoreCase) ||
80+
// match on name containing keyword
81+
matchItem.Name.Contains(f, StringComparison.InvariantCultureIgnoreCase) ||
82+
// match on ID
83+
matchItem.Id == f
84+
);
85+
};
86+
87+
//sort by name ascending
88+
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).SortDescriptions.Clear();
89+
90+
if (_sortOrder == "NameAsc")
91+
{
92+
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).SortDescriptions.Add(
93+
new System.ComponentModel.SortDescription("Name", System.ComponentModel.ListSortDirection.Ascending)
94+
);
95+
}
9496

95-
if (_sortOrder == "ExpiryDateAsc")
96-
{
97-
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).SortDescriptions.Add(
98-
new System.ComponentModel.SortDescription("DateExpiry", System.ComponentModel.ListSortDirection.Ascending)
99-
);
100-
}
97+
if (_sortOrder == "ExpiryDateAsc")
98+
{
99+
CollectionViewSource.GetDefaultView(_appViewModel.ManagedCertificates).SortDescriptions.Add(
100+
new System.ComponentModel.SortDescription("DateExpiry", System.ComponentModel.ListSortDirection.Ascending)
101+
);
102+
}
103+
});
101104
}
102105

103106
private async void ListViewItem_InteractionEvent(object sender, InputEventArgs e)

0 commit comments

Comments
 (0)