Skip to content

Commit 924509d

Browse files
committed
Fix MultipleChoiceFilter: programmatic change of filter does not update ListBox either
1 parent acf608b commit 924509d

File tree

3 files changed

+44
-19
lines changed

3 files changed

+44
-19
lines changed

src/DataGridExtensions/MultipleChoiceFilter.cs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class MultipleChoiceFilter : Control
2323
{
2424
private DataGrid? _dataGrid;
2525
private ListBox? _listBox;
26+
private bool _isFilterChanging;
2627

2728
static MultipleChoiceFilter()
2829
{
@@ -236,31 +237,42 @@ private void ListBox_Loaded(object sender, RoutedEventArgs e)
236237

237238
private void Filter_Changed()
238239
{
239-
var listBox = _listBox;
240-
if (listBox == null)
241-
return;
240+
_isFilterChanging = true;
242241

243-
var filter = Filter;
242+
try
243+
{
244+
var listBox = _listBox;
245+
if (listBox == null)
246+
return;
244247

245-
Text = filter?.Text;
248+
var filter = Filter;
246249

247-
if (filter?.Items == null)
248-
{
249-
listBox.SelectAll();
250-
return;
251-
}
250+
Text = filter?.Text;
252251

253-
if (listBox.SelectedItems.Count != 0)
254-
return;
252+
if (filter?.Items == null)
253+
{
254+
listBox.SelectAll();
255+
return;
256+
}
257+
258+
listBox.SelectedItems.Clear();
255259

256-
foreach (var item in filter.Items)
260+
foreach (var item in filter.Items)
261+
{
262+
listBox.SelectedItems.Add(item);
263+
}
264+
}
265+
finally
257266
{
258-
listBox.SelectedItems.Add(item);
267+
_isFilterChanging = false;
259268
}
260269
}
261270

262271
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
263272
{
273+
if (_isFilterChanging)
274+
return;
275+
264276
var listBox = (ListBox)sender;
265277

266278
if (!listBox.IsLoaded)

src/DataGridExtensionsSample/Views/Customized2View.xaml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,15 @@
6666
<DockPanel DockPanel.Dock="Top" Margin="10">
6767
<DockPanel DockPanel.Dock="Right">
6868
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
69-
<Button x:Name="ClearIpsumButton" VerticalAlignment="Top" Padding="5,2" Command="{Binding ClearIpsumCommand}">Clear Ipsum</Button>
69+
<Button x:Name="ClearIpsumButton" VerticalAlignment="Top" Padding="5,2" Command="{Binding ClearIpsumCommand}">Remove ipsum from data</Button>
7070
<Decorator Width="10" />
71-
<Button x:Name="OpenAndPopulateAFilterButton" VerticalAlignment="Top" Padding="5,2" Command="{Binding OpenAndPopulateAFilterCommand}">Open &amp; Populate a Filter</Button>
71+
<Button VerticalAlignment="Top" Padding="5,2" Command="{Binding AddLoremCommand}">Add lorem to selection</Button>
7272
<Decorator Width="10" />
73-
<Button x:Name="ClearFilter" VerticalAlignment="Top" Padding="5,2" Command="{Binding ClearFilterCommand}" CommandParameter="{Binding ElementName=DemoDataGrid}">Clear Filter</Button>
73+
<Button VerticalAlignment="Top" Padding="5,2" Command="{Binding OpenAndPopulateAFilterCommand}">Open &amp; Populate a Filter</Button>
7474
<Decorator Width="10" />
75-
<Button x:Name="ProgrammaticAccessToFilterControlButton" VerticalAlignment="Top" Padding="5,2" Command="{Binding ProgrammaticAccessToFilterControlCommand}">Change Popup Caption</Button>
75+
<Button VerticalAlignment="Top" Padding="5,2" Command="{Binding ClearFilterCommand}" CommandParameter="{Binding ElementName=DemoDataGrid}">Clear Filter</Button>
76+
<Decorator Width="10" />
77+
<Button VerticalAlignment="Top" Padding="5,2" Command="{Binding ProgrammaticAccessToFilterControlCommand}">Change Popup Caption</Button>
7678
</StackPanel>
7779
<StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Right">
7880
<TextBlock Text="Selected: "></TextBlock>

src/DataGridExtensionsSample/Views/Customized2ViewModel.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public Customized2ViewModel(DataProvider dataProvider)
3333

3434
public object? Column5Filter { get; set; }
3535

36-
public object ColumnTextWithPrefilterFilter { get; set; } = new MultipleChoiceContentFilter(new List<string> { "amet" });
36+
public MultipleChoiceContentFilter ColumnTextWithPrefilterFilter { get; set; } = new(new List<string> { "amet" });
3737

3838
public bool Column5PopupVisible { get; set; }
3939

@@ -58,6 +58,17 @@ private void ClearIpsum()
5858
DataProvider.Items.RemoveWhere(item => item.Column5 == "ipsum");
5959
}
6060

61+
public ICommand AddLoremCommand => new DelegateCommand(AddLorem);
62+
63+
private void AddLorem()
64+
{
65+
var items = ColumnTextWithPrefilterFilter.Items ?? new HashSet<string>();
66+
67+
items.Add("lorem");
68+
69+
ColumnTextWithPrefilterFilter = new MultipleChoiceContentFilter(items);
70+
}
71+
6172
public ICommand OpenAndPopulateAFilterCommand => new DelegateCommand(OpenAndPopulateAFilter);
6273

6374
private void OpenAndPopulateAFilter()

0 commit comments

Comments
 (0)