How to select first item after filtering ICollectionView












0














I'm binding a ListView to an ICollectionView in my viewmodel. The ICollectionView has some predefined filters that are applied when you click some buttons. However I cannot seem to find any way to (auto) select the first item in the ListView after the collection has been filtered.



I've tried to set SelectedIndex=0, add both Target and Source notification to the binding, but all are ineffective when the filter applies.



Any pointers on how to achieve this?



EDIT: Below code illustrates my issue I'd say.



XAML:



<Window x:Class="CollectionViewTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CollectionViewTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">

<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<!-- MENU -->
<StackPanel Orientation="Vertical">
<Button Content="Numbers below 4" Click="Below4_Click" Width="100"/>
<Button Content="Numbers below 7" Click="Below7_Click" Width="100"/>
<Button Content="All numbers" Click="All_Click" Width="100"/>
</StackPanel>

<!-- LIST -->
<ListView
Grid.Column="1"
SelectedIndex="0"
ItemsSource="{Binding Numbers, Mode=OneWay}"
SelectedItem="{Binding SelectedNumber, Mode=TwoWay}">
<ListView.Resources>
<DataTemplate DataType="{x:Type local:Number}">
<TextBlock Text="{Binding Value}" />
</DataTemplate>
</ListView.Resources>
</ListView>

<!-- DETAILS -->
<TextBlock Grid.Column="2" Text="{Binding SelectedNumber.Text}" Width="100"/>
</Grid>
</Window>


Code-Behind:



using System.Windows;

namespace CollectionViewTest
{
public partial class MainWindow : Window
{
private MainViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = (MainViewModel)DataContext;
}

private void Below4_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 4;
}

private void Below7_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 7;
}

private void All_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => true;
}
}
}


ViewModel:



using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Data;
using System.Collections.ObjectModel;

namespace CollectionViewTest
{
public class MainViewModel : PropertyChangedBase
{

public MainViewModel()
{
Numbers = new ObservableCollection<Number>();
NumberCollection = CollectionViewSource.GetDefaultView(Numbers);
NumberCollection.Filter = Filter;
NumberCollection.SortDescriptions.Add(new SortDescription("Value", ListSortDirection.Ascending));

for (int i = 0; i < 10; i++)
Numbers.Add(new Number { Value = i, Text = $"This is number {i}." });

}

private Func<Number, bool> menuFilter;
public Func<Number, bool> MenuFilter
{
get => menuFilter;
set
{
menuFilter = value;
NumberCollection.Refresh();
}
}

private bool Filter(object item)
{
var number = (Number)item;
return MenuFilter == null ? true : MenuFilter(number);
}

public ObservableCollection<Number> Numbers { get; set; }
public ICollectionView NumberCollection { get; set; }

private Number selectedNumber;
public Number SelectedNumber { get => selectedNumber; set => Set(ref selectedNumber, value); }
}

public class Number : PropertyChangedBase
{
public int Value { get; set; }

private string text;
public string Text { get => text; set => Set(ref text, value); }
}

public class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected void Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}


As you can see, pressing one of the buttons changes the Filter and calls Refresh on the collection. What I would like to have, is that the first item in the list (here '0') is selected automatically which then would display the text "This is number 0" in the text in column 2.



I have tried both the SelectedIndex=0 and also MoveCurrentToFirst but nothing is selected.










share|improve this question




















  • 1




    Did you really try to set the SelectedIndex property of the ListView to 0? This should work.
    – mm8
    Nov 22 at 12:42












  • Yes and it does not work when the filter changes. I'll try to make a test outside my context in the weekend, but the ICollectionView + ListView in my application here is pretty basic so I doubt it...but I shall return.
    – Werner
    Nov 23 at 14:49












  • @mm8 Example added. Seems that setting SelectedIndex = 0 only works if I do not call ICollectionView.Refresh. But I have to in order to evaluate the filter?
    – Werner
    Nov 26 at 8:38
















0














I'm binding a ListView to an ICollectionView in my viewmodel. The ICollectionView has some predefined filters that are applied when you click some buttons. However I cannot seem to find any way to (auto) select the first item in the ListView after the collection has been filtered.



I've tried to set SelectedIndex=0, add both Target and Source notification to the binding, but all are ineffective when the filter applies.



Any pointers on how to achieve this?



EDIT: Below code illustrates my issue I'd say.



XAML:



<Window x:Class="CollectionViewTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CollectionViewTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">

<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<!-- MENU -->
<StackPanel Orientation="Vertical">
<Button Content="Numbers below 4" Click="Below4_Click" Width="100"/>
<Button Content="Numbers below 7" Click="Below7_Click" Width="100"/>
<Button Content="All numbers" Click="All_Click" Width="100"/>
</StackPanel>

<!-- LIST -->
<ListView
Grid.Column="1"
SelectedIndex="0"
ItemsSource="{Binding Numbers, Mode=OneWay}"
SelectedItem="{Binding SelectedNumber, Mode=TwoWay}">
<ListView.Resources>
<DataTemplate DataType="{x:Type local:Number}">
<TextBlock Text="{Binding Value}" />
</DataTemplate>
</ListView.Resources>
</ListView>

<!-- DETAILS -->
<TextBlock Grid.Column="2" Text="{Binding SelectedNumber.Text}" Width="100"/>
</Grid>
</Window>


Code-Behind:



using System.Windows;

namespace CollectionViewTest
{
public partial class MainWindow : Window
{
private MainViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = (MainViewModel)DataContext;
}

private void Below4_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 4;
}

private void Below7_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 7;
}

private void All_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => true;
}
}
}


ViewModel:



using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Data;
using System.Collections.ObjectModel;

namespace CollectionViewTest
{
public class MainViewModel : PropertyChangedBase
{

public MainViewModel()
{
Numbers = new ObservableCollection<Number>();
NumberCollection = CollectionViewSource.GetDefaultView(Numbers);
NumberCollection.Filter = Filter;
NumberCollection.SortDescriptions.Add(new SortDescription("Value", ListSortDirection.Ascending));

for (int i = 0; i < 10; i++)
Numbers.Add(new Number { Value = i, Text = $"This is number {i}." });

}

private Func<Number, bool> menuFilter;
public Func<Number, bool> MenuFilter
{
get => menuFilter;
set
{
menuFilter = value;
NumberCollection.Refresh();
}
}

private bool Filter(object item)
{
var number = (Number)item;
return MenuFilter == null ? true : MenuFilter(number);
}

public ObservableCollection<Number> Numbers { get; set; }
public ICollectionView NumberCollection { get; set; }

private Number selectedNumber;
public Number SelectedNumber { get => selectedNumber; set => Set(ref selectedNumber, value); }
}

public class Number : PropertyChangedBase
{
public int Value { get; set; }

private string text;
public string Text { get => text; set => Set(ref text, value); }
}

public class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected void Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}


As you can see, pressing one of the buttons changes the Filter and calls Refresh on the collection. What I would like to have, is that the first item in the list (here '0') is selected automatically which then would display the text "This is number 0" in the text in column 2.



I have tried both the SelectedIndex=0 and also MoveCurrentToFirst but nothing is selected.










share|improve this question




















  • 1




    Did you really try to set the SelectedIndex property of the ListView to 0? This should work.
    – mm8
    Nov 22 at 12:42












  • Yes and it does not work when the filter changes. I'll try to make a test outside my context in the weekend, but the ICollectionView + ListView in my application here is pretty basic so I doubt it...but I shall return.
    – Werner
    Nov 23 at 14:49












  • @mm8 Example added. Seems that setting SelectedIndex = 0 only works if I do not call ICollectionView.Refresh. But I have to in order to evaluate the filter?
    – Werner
    Nov 26 at 8:38














0












0








0







I'm binding a ListView to an ICollectionView in my viewmodel. The ICollectionView has some predefined filters that are applied when you click some buttons. However I cannot seem to find any way to (auto) select the first item in the ListView after the collection has been filtered.



I've tried to set SelectedIndex=0, add both Target and Source notification to the binding, but all are ineffective when the filter applies.



Any pointers on how to achieve this?



EDIT: Below code illustrates my issue I'd say.



XAML:



<Window x:Class="CollectionViewTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CollectionViewTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">

<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<!-- MENU -->
<StackPanel Orientation="Vertical">
<Button Content="Numbers below 4" Click="Below4_Click" Width="100"/>
<Button Content="Numbers below 7" Click="Below7_Click" Width="100"/>
<Button Content="All numbers" Click="All_Click" Width="100"/>
</StackPanel>

<!-- LIST -->
<ListView
Grid.Column="1"
SelectedIndex="0"
ItemsSource="{Binding Numbers, Mode=OneWay}"
SelectedItem="{Binding SelectedNumber, Mode=TwoWay}">
<ListView.Resources>
<DataTemplate DataType="{x:Type local:Number}">
<TextBlock Text="{Binding Value}" />
</DataTemplate>
</ListView.Resources>
</ListView>

<!-- DETAILS -->
<TextBlock Grid.Column="2" Text="{Binding SelectedNumber.Text}" Width="100"/>
</Grid>
</Window>


Code-Behind:



using System.Windows;

namespace CollectionViewTest
{
public partial class MainWindow : Window
{
private MainViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = (MainViewModel)DataContext;
}

private void Below4_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 4;
}

private void Below7_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 7;
}

private void All_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => true;
}
}
}


ViewModel:



using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Data;
using System.Collections.ObjectModel;

namespace CollectionViewTest
{
public class MainViewModel : PropertyChangedBase
{

public MainViewModel()
{
Numbers = new ObservableCollection<Number>();
NumberCollection = CollectionViewSource.GetDefaultView(Numbers);
NumberCollection.Filter = Filter;
NumberCollection.SortDescriptions.Add(new SortDescription("Value", ListSortDirection.Ascending));

for (int i = 0; i < 10; i++)
Numbers.Add(new Number { Value = i, Text = $"This is number {i}." });

}

private Func<Number, bool> menuFilter;
public Func<Number, bool> MenuFilter
{
get => menuFilter;
set
{
menuFilter = value;
NumberCollection.Refresh();
}
}

private bool Filter(object item)
{
var number = (Number)item;
return MenuFilter == null ? true : MenuFilter(number);
}

public ObservableCollection<Number> Numbers { get; set; }
public ICollectionView NumberCollection { get; set; }

private Number selectedNumber;
public Number SelectedNumber { get => selectedNumber; set => Set(ref selectedNumber, value); }
}

public class Number : PropertyChangedBase
{
public int Value { get; set; }

private string text;
public string Text { get => text; set => Set(ref text, value); }
}

public class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected void Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}


As you can see, pressing one of the buttons changes the Filter and calls Refresh on the collection. What I would like to have, is that the first item in the list (here '0') is selected automatically which then would display the text "This is number 0" in the text in column 2.



I have tried both the SelectedIndex=0 and also MoveCurrentToFirst but nothing is selected.










share|improve this question















I'm binding a ListView to an ICollectionView in my viewmodel. The ICollectionView has some predefined filters that are applied when you click some buttons. However I cannot seem to find any way to (auto) select the first item in the ListView after the collection has been filtered.



I've tried to set SelectedIndex=0, add both Target and Source notification to the binding, but all are ineffective when the filter applies.



Any pointers on how to achieve this?



EDIT: Below code illustrates my issue I'd say.



XAML:



<Window x:Class="CollectionViewTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CollectionViewTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">

<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<!-- MENU -->
<StackPanel Orientation="Vertical">
<Button Content="Numbers below 4" Click="Below4_Click" Width="100"/>
<Button Content="Numbers below 7" Click="Below7_Click" Width="100"/>
<Button Content="All numbers" Click="All_Click" Width="100"/>
</StackPanel>

<!-- LIST -->
<ListView
Grid.Column="1"
SelectedIndex="0"
ItemsSource="{Binding Numbers, Mode=OneWay}"
SelectedItem="{Binding SelectedNumber, Mode=TwoWay}">
<ListView.Resources>
<DataTemplate DataType="{x:Type local:Number}">
<TextBlock Text="{Binding Value}" />
</DataTemplate>
</ListView.Resources>
</ListView>

<!-- DETAILS -->
<TextBlock Grid.Column="2" Text="{Binding SelectedNumber.Text}" Width="100"/>
</Grid>
</Window>


Code-Behind:



using System.Windows;

namespace CollectionViewTest
{
public partial class MainWindow : Window
{
private MainViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = (MainViewModel)DataContext;
}

private void Below4_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 4;
}

private void Below7_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => f.Value < 7;
}

private void All_Click(object sender, RoutedEventArgs e)
{
vm.MenuFilter = f => true;
}
}
}


ViewModel:



using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Data;
using System.Collections.ObjectModel;

namespace CollectionViewTest
{
public class MainViewModel : PropertyChangedBase
{

public MainViewModel()
{
Numbers = new ObservableCollection<Number>();
NumberCollection = CollectionViewSource.GetDefaultView(Numbers);
NumberCollection.Filter = Filter;
NumberCollection.SortDescriptions.Add(new SortDescription("Value", ListSortDirection.Ascending));

for (int i = 0; i < 10; i++)
Numbers.Add(new Number { Value = i, Text = $"This is number {i}." });

}

private Func<Number, bool> menuFilter;
public Func<Number, bool> MenuFilter
{
get => menuFilter;
set
{
menuFilter = value;
NumberCollection.Refresh();
}
}

private bool Filter(object item)
{
var number = (Number)item;
return MenuFilter == null ? true : MenuFilter(number);
}

public ObservableCollection<Number> Numbers { get; set; }
public ICollectionView NumberCollection { get; set; }

private Number selectedNumber;
public Number SelectedNumber { get => selectedNumber; set => Set(ref selectedNumber, value); }
}

public class Number : PropertyChangedBase
{
public int Value { get; set; }

private string text;
public string Text { get => text; set => Set(ref text, value); }
}

public class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected void Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}


As you can see, pressing one of the buttons changes the Filter and calls Refresh on the collection. What I would like to have, is that the first item in the list (here '0') is selected automatically which then would display the text "This is number 0" in the text in column 2.



I have tried both the SelectedIndex=0 and also MoveCurrentToFirst but nothing is selected.







c# wpf listview icollectionview






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 26 at 8:30

























asked Nov 22 at 12:29









Werner

443413




443413








  • 1




    Did you really try to set the SelectedIndex property of the ListView to 0? This should work.
    – mm8
    Nov 22 at 12:42












  • Yes and it does not work when the filter changes. I'll try to make a test outside my context in the weekend, but the ICollectionView + ListView in my application here is pretty basic so I doubt it...but I shall return.
    – Werner
    Nov 23 at 14:49












  • @mm8 Example added. Seems that setting SelectedIndex = 0 only works if I do not call ICollectionView.Refresh. But I have to in order to evaluate the filter?
    – Werner
    Nov 26 at 8:38














  • 1




    Did you really try to set the SelectedIndex property of the ListView to 0? This should work.
    – mm8
    Nov 22 at 12:42












  • Yes and it does not work when the filter changes. I'll try to make a test outside my context in the weekend, but the ICollectionView + ListView in my application here is pretty basic so I doubt it...but I shall return.
    – Werner
    Nov 23 at 14:49












  • @mm8 Example added. Seems that setting SelectedIndex = 0 only works if I do not call ICollectionView.Refresh. But I have to in order to evaluate the filter?
    – Werner
    Nov 26 at 8:38








1




1




Did you really try to set the SelectedIndex property of the ListView to 0? This should work.
– mm8
Nov 22 at 12:42






Did you really try to set the SelectedIndex property of the ListView to 0? This should work.
– mm8
Nov 22 at 12:42














Yes and it does not work when the filter changes. I'll try to make a test outside my context in the weekend, but the ICollectionView + ListView in my application here is pretty basic so I doubt it...but I shall return.
– Werner
Nov 23 at 14:49






Yes and it does not work when the filter changes. I'll try to make a test outside my context in the weekend, but the ICollectionView + ListView in my application here is pretty basic so I doubt it...but I shall return.
– Werner
Nov 23 at 14:49














@mm8 Example added. Seems that setting SelectedIndex = 0 only works if I do not call ICollectionView.Refresh. But I have to in order to evaluate the filter?
– Werner
Nov 26 at 8:38




@mm8 Example added. Seems that setting SelectedIndex = 0 only works if I do not call ICollectionView.Refresh. But I have to in order to evaluate the filter?
– Werner
Nov 26 at 8:38












1 Answer
1






active

oldest

votes


















3














Don't set SelectedIndex when binding to an ICollectionView. Instead, set its CurrentItem via MoveCurrentTo() or MoveCurrentToFirst():



myCollectionView.MoveCurrentTo(someItem);
...
myCollectionView.MoveCurrentToFirst();


Also, set IsSynchronizedWithCurrentItem on your ListView:



<ListView IsSynchronizedWithCurrentItem="True" ...


Detect when filter is applied



When the filter is evaluated, the collection view is refreshed which in turn resets the collection. To detect this, listen for the CollectionChanged event and look for the NotifyCollectionChangedAction.Reset flag. Please refer to the CollectionView source code for more details.






share|improve this answer























  • Right. Updated code to use public MoveCurrentTo() method...
    – l33t
    Nov 22 at 13:59










  • myCollectionView.MoveCurrentToFirst()
    – Rekshino
    Nov 22 at 14:09










  • But MoveCurrentToFirst and derived methods are something I need to invoke to make the change - not a setting. Afaik there is no way for me to know WHEN the filtering is done?
    – Werner
    Nov 23 at 7:41










  • Please see my latest update.
    – l33t
    Nov 24 at 10:50










  • @l33t Please look at my updated example, I've tried to subscribe to the CollectionChanged event (not in example though). But calling MoveCurrentToFirst() does nothing apparently.
    – Werner
    Nov 26 at 8:37











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431070%2fhow-to-select-first-item-after-filtering-icollectionview%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









3














Don't set SelectedIndex when binding to an ICollectionView. Instead, set its CurrentItem via MoveCurrentTo() or MoveCurrentToFirst():



myCollectionView.MoveCurrentTo(someItem);
...
myCollectionView.MoveCurrentToFirst();


Also, set IsSynchronizedWithCurrentItem on your ListView:



<ListView IsSynchronizedWithCurrentItem="True" ...


Detect when filter is applied



When the filter is evaluated, the collection view is refreshed which in turn resets the collection. To detect this, listen for the CollectionChanged event and look for the NotifyCollectionChangedAction.Reset flag. Please refer to the CollectionView source code for more details.






share|improve this answer























  • Right. Updated code to use public MoveCurrentTo() method...
    – l33t
    Nov 22 at 13:59










  • myCollectionView.MoveCurrentToFirst()
    – Rekshino
    Nov 22 at 14:09










  • But MoveCurrentToFirst and derived methods are something I need to invoke to make the change - not a setting. Afaik there is no way for me to know WHEN the filtering is done?
    – Werner
    Nov 23 at 7:41










  • Please see my latest update.
    – l33t
    Nov 24 at 10:50










  • @l33t Please look at my updated example, I've tried to subscribe to the CollectionChanged event (not in example though). But calling MoveCurrentToFirst() does nothing apparently.
    – Werner
    Nov 26 at 8:37
















3














Don't set SelectedIndex when binding to an ICollectionView. Instead, set its CurrentItem via MoveCurrentTo() or MoveCurrentToFirst():



myCollectionView.MoveCurrentTo(someItem);
...
myCollectionView.MoveCurrentToFirst();


Also, set IsSynchronizedWithCurrentItem on your ListView:



<ListView IsSynchronizedWithCurrentItem="True" ...


Detect when filter is applied



When the filter is evaluated, the collection view is refreshed which in turn resets the collection. To detect this, listen for the CollectionChanged event and look for the NotifyCollectionChangedAction.Reset flag. Please refer to the CollectionView source code for more details.






share|improve this answer























  • Right. Updated code to use public MoveCurrentTo() method...
    – l33t
    Nov 22 at 13:59










  • myCollectionView.MoveCurrentToFirst()
    – Rekshino
    Nov 22 at 14:09










  • But MoveCurrentToFirst and derived methods are something I need to invoke to make the change - not a setting. Afaik there is no way for me to know WHEN the filtering is done?
    – Werner
    Nov 23 at 7:41










  • Please see my latest update.
    – l33t
    Nov 24 at 10:50










  • @l33t Please look at my updated example, I've tried to subscribe to the CollectionChanged event (not in example though). But calling MoveCurrentToFirst() does nothing apparently.
    – Werner
    Nov 26 at 8:37














3












3








3






Don't set SelectedIndex when binding to an ICollectionView. Instead, set its CurrentItem via MoveCurrentTo() or MoveCurrentToFirst():



myCollectionView.MoveCurrentTo(someItem);
...
myCollectionView.MoveCurrentToFirst();


Also, set IsSynchronizedWithCurrentItem on your ListView:



<ListView IsSynchronizedWithCurrentItem="True" ...


Detect when filter is applied



When the filter is evaluated, the collection view is refreshed which in turn resets the collection. To detect this, listen for the CollectionChanged event and look for the NotifyCollectionChangedAction.Reset flag. Please refer to the CollectionView source code for more details.






share|improve this answer














Don't set SelectedIndex when binding to an ICollectionView. Instead, set its CurrentItem via MoveCurrentTo() or MoveCurrentToFirst():



myCollectionView.MoveCurrentTo(someItem);
...
myCollectionView.MoveCurrentToFirst();


Also, set IsSynchronizedWithCurrentItem on your ListView:



<ListView IsSynchronizedWithCurrentItem="True" ...


Detect when filter is applied



When the filter is evaluated, the collection view is refreshed which in turn resets the collection. To detect this, listen for the CollectionChanged event and look for the NotifyCollectionChangedAction.Reset flag. Please refer to the CollectionView source code for more details.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 23 at 8:49

























answered Nov 22 at 12:55









l33t

6,0841258127




6,0841258127












  • Right. Updated code to use public MoveCurrentTo() method...
    – l33t
    Nov 22 at 13:59










  • myCollectionView.MoveCurrentToFirst()
    – Rekshino
    Nov 22 at 14:09










  • But MoveCurrentToFirst and derived methods are something I need to invoke to make the change - not a setting. Afaik there is no way for me to know WHEN the filtering is done?
    – Werner
    Nov 23 at 7:41










  • Please see my latest update.
    – l33t
    Nov 24 at 10:50










  • @l33t Please look at my updated example, I've tried to subscribe to the CollectionChanged event (not in example though). But calling MoveCurrentToFirst() does nothing apparently.
    – Werner
    Nov 26 at 8:37


















  • Right. Updated code to use public MoveCurrentTo() method...
    – l33t
    Nov 22 at 13:59










  • myCollectionView.MoveCurrentToFirst()
    – Rekshino
    Nov 22 at 14:09










  • But MoveCurrentToFirst and derived methods are something I need to invoke to make the change - not a setting. Afaik there is no way for me to know WHEN the filtering is done?
    – Werner
    Nov 23 at 7:41










  • Please see my latest update.
    – l33t
    Nov 24 at 10:50










  • @l33t Please look at my updated example, I've tried to subscribe to the CollectionChanged event (not in example though). But calling MoveCurrentToFirst() does nothing apparently.
    – Werner
    Nov 26 at 8:37
















Right. Updated code to use public MoveCurrentTo() method...
– l33t
Nov 22 at 13:59




Right. Updated code to use public MoveCurrentTo() method...
– l33t
Nov 22 at 13:59












myCollectionView.MoveCurrentToFirst()
– Rekshino
Nov 22 at 14:09




myCollectionView.MoveCurrentToFirst()
– Rekshino
Nov 22 at 14:09












But MoveCurrentToFirst and derived methods are something I need to invoke to make the change - not a setting. Afaik there is no way for me to know WHEN the filtering is done?
– Werner
Nov 23 at 7:41




But MoveCurrentToFirst and derived methods are something I need to invoke to make the change - not a setting. Afaik there is no way for me to know WHEN the filtering is done?
– Werner
Nov 23 at 7:41












Please see my latest update.
– l33t
Nov 24 at 10:50




Please see my latest update.
– l33t
Nov 24 at 10:50












@l33t Please look at my updated example, I've tried to subscribe to the CollectionChanged event (not in example though). But calling MoveCurrentToFirst() does nothing apparently.
– Werner
Nov 26 at 8:37




@l33t Please look at my updated example, I've tried to subscribe to the CollectionChanged event (not in example though). But calling MoveCurrentToFirst() does nothing apparently.
– Werner
Nov 26 at 8:37


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431070%2fhow-to-select-first-item-after-filtering-icollectionview%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Berounka

Sphinx de Gizeh

Different font size/position of beamer's navigation symbols template's content depending on regular/plain...