codemoonger
codemoonger

Reputation: 663

ObservableCollection filter Selected Item

I have a problem that I don't know how to solve.

I have a observable collection that I filter the items as I type in a textbox the problem is that when I select the filtered item I get the wrong selected index.

For example I have one item after filtering the real selected index is 2 but because it sets the collection as I type it set the index to one if the only filtered item left is one.

So how do I get the right item selected. Like in the mail application to make my question maybe easier to understand

Here is the selection changed event:

private void searchToDoItemsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (searchToDoItemsListBox.SelectedIndex == -1)
        return;
    NavigationService.Navigate(new Uri("/DetailsPage.xaml?selectedItemSearch=" + searchToDoItemsListBox.SelectedIndex, UriKind.Relative));
    searchToDoItemsListBox.SelectedIndex = -1;
}

And here is for the details page:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    if (NavigationContext.QueryString.TryGetValue("selectedItemSearch", out selectedIndexSearch))
    {
        int indexSearch = int.Parse(selectedIndexSearch);
        DataContext = App.ViewModel.AllToDoItems[indexSearch];
    }

}

Upvotes: 2

Views: 2291

Answers (2)

codemoonger
codemoonger

Reputation: 663

Have done like this now and i get nothing now at all. It navigates but nothings shows.

if (NavigationContext.QueryString.TryGetValue("selectedItemSearch", out selectedIndexSearch))
        {
            //int indexSearch = int.Parse(selectedIndexSearch);
            //DataContext = App.ViewModel.AllToDoItems[indexSearch];

            int id = int.Parse(selectedIndexSearch);
            DataContext = GetById(id);
        }

public object GetById(int id)
{
    for(int i = 0; i < App.ViewModel.AllToDoItems.Count; i++)
    {
        if (App.ViewModel.AllToDoItems[i].ToDoItemId == id) 
        return App.ViewModel.AllToDoItems[i];
    }
    return null;
}

The AllToDoItems looks like below, its a observable collection; This is in the ViewModel this below load the collection from the database. ToDoItem is the table name in the Model.

        // Specify the query for all to-do items in the database.
        var toDoItemsInDB = from ToDoItem todo in toDoDB.Items
                            select todo;

        // Query the database and load all to-do items.
        AllToDoItems = new ObservableCollection<ToDoItem>(toDoItemsInDB);

The Model looks like this:

     public Table<ToDoItem> Items;
    //public Table<ToDoFavCategory> Categories;
}

[Table]
public class ToDoItem : INotifyPropertyChanged, INotifyPropertyChanging
{

    // Define ID: private field, public property, and database column.
    private int _toDoItemId;

    [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
    public int ToDoItemId
    {
        get { return _toDoItemId; }
        set
        {
            if (_toDoItemId != value)
            {
                NotifyPropertyChanging("ToDoItemId");
                _toDoItemId = value;
                NotifyPropertyChanged("ToDoItemId");
            }
        }
    }

Its easier maybe to take a look at this link where i have build it from http://msdn.microsoft.com/en-us/library/hh286405(v=vs.92).aspx

Upvotes: 0

Anton Sizikov
Anton Sizikov

Reputation: 9240

Bind to the SelectedItem

<ListBox SelectedItem="{Binding Selected, Mode=TwoWay}" ItemsSource="Binding={Items}">
</ListBox>

and you have to fields:

public ObservableCollection<ItemType> Items {get;set;} //setted while filtering, does it?

and

private ItemType _selected;
public ItemType Selected
{
  get 
  {
    return _selected;
  }
  set 
  { 
     _selected = value;
     //here you can save the item. 
     //For example save the item id, and navigate to DetailsPage
  }
}

And then, you can get the item from list:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        if (NavigationContext.QueryString.TryGetValue("selectedItemSearch", out selectedIndexSearch))
        {
            int id = int.Parse(selectedIndexSearch);
            DataContext = GetById(id)
        }
    }

  public ItemType GetByIf(id) 
  {
    for(int i = 0; i < App.ViewModel.AllToDoItems.Count; i++)
    {
        if(App.ViewModel.AllToDoItems[i].Id == id) return App.ViewModel.AllToDoItems[i];
    }
    return null;
  }

Upvotes: 1

Related Questions