2

解決方法がわからないという問題があります。

テキストボックスに入力するときにアイテムをフィルタリングする監視可能なコレクションがあります。問題は、フィルタリングされたアイテムを選択すると、間違った選択されたインデックスが取得されることです。

たとえば、実際に選択されたインデックスをフィルタリングした後、アイテムが1つありますが、入力時にコレクションが設定されるため、フィルタリングされたアイテムが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 に答える