2

我有一个问题,我不知道如何解决。

我有一个可观察的集合,我在文本框中键入时过滤项目,问题是当我选择过滤的项目时,我得到错误的选择索引。

例如,在过滤实际选定的索引为 2 后,我有一个项目,但因为它在我键入时设置集合,如果剩下的唯一过滤项目是 1,它会将索引设置为 1。

那么如何选择正确的项目。就像在邮件应用程序中一样,让我的问题更容易理解

这是选择更改事件:

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;
}

这是详细信息页面:

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];
    }

}
4

2 回答 2

1

绑定到 SelectedItem

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

你必须字段:

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

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
  }
}

然后,您可以从列表中获取项目:

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;
  }
于 2012-09-17T13:47:27.190 回答
0

现在已经这样做了,我现在什么也得不到。它导航但没有显示。

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;
}

AllToDoItems 如下所示,它是一个可观察的集合;这是在下面从数据库加载集合的 ViewModel 中。ToDoItem 是模型中的表名。

        // 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);

模型如下所示:

     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");
            }
        }
    }

也许更容易看一下我从 http://msdn.microsoft.com/en-us/library/hh286405(v=vs.92).aspx构建它的链接

于 2012-09-18T08:38:24.210 回答