2010-07-16 94 views
3

我有一個列表視圖(在擴展選擇模式,並與當前項目同步)和一個文本框。該文本框允許用戶輸入搜索條件。在列表框的TextChanged事件中,我將搜索條件與列表視圖中listviewitems的名稱進行匹配,並相應地設置selectedindex。這是爲了突出它,並提供一個簡單的選擇點,從中選擇更多的點。見下面的代碼:WPF列表視圖選擇問題

void searchTextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     try 
     { 
      TextBox textBox = (TextBox)sender; 
      if (textBox != null) 
      { 
       string text = textBox.Text; 
       if (text != string.Empty) 
       { 
        for (int i = 0; i < listViewPerson.Items.Count; i++) 
        { 
         Person person = (Person)listViewPerson.Items[i]; 
         if (person != null) 
         { 
          if (person .Name.StartsWith(text, StringComparison.OrdinalIgnoreCase)) 
          { 
           listViewPerson.SelectedIndex = i; 
           listViewPerson.ScrollIntoView(routePoint); 
           break; 
          } 
         } 
        } 
       } 
       else 
       { 
        listViewPerson.SelectedIndex = -1; 
       } 
      } 
     } 
     catch (Exception Caught) 
     { 
      Log.AddExceptionEntry(this, "Could not search ", Caught, Log.Target.All, 
       Log.EntryType.Error); 
     } 
    } 

搜索和選擇工作得很好。在第一次嘗試時,用戶可以選擇第二個點(第一個點已經由搜索選擇)並從第一個點開始多選,而沒有問題。

然而,第二次循環時,listview繼續從第一次搜索(它最初由搜索例程設置)中「記住」第一個選定點,因此導致選擇從錯誤的地方開始(即使selectedIndex是正確設置爲列表視圖中的新項目)。

但是,鼠標單擊selectedindex然後導致選擇點被重置爲正確。與使用手動點擊相比,似乎selectedindex在代碼中的工作方式不同。

我試過使用listViewTrainServiceHelperPattern.SelectedItems.Clear(),SelectedValue(object)而不是SelectedIndex,但都無濟於事。有沒有人有任何想法是什麼造成這一點,以及如何解決它?

+0

我已經讀過幾遍,但對於一些缺失的信息還是有點困惑。選擇第二個「點」意味着什麼,以及「第二次圍繞列表視圖」開始的是什麼行動或事件。如果選擇了多個項目,'selectedindex'將返回第一個選擇的索引,而不是最近選擇的索引。但是,從您的問題來看,我無法分辨您的搜索引擎第一次運行和「第二次」之間會發生什麼。所有項目都被清除了嗎,你是否執行定製邏輯......? – Scott 2010-07-16 14:03:07

+0

什麼是'routePoint'?看起來這可能跨越這個事件的調用。此外,這段代碼對我來說看起來不是很「MVVM」,因爲它具有代碼隱藏的視圖邏輯,而不是視圖模型。如果您在使用MVVM實時處理'TextChanged'時遇到問題,請在您的綁定中嘗試以下操作:'UpdateSourceTrigger = PropertyChanged' – 2011-06-27 01:18:36

+0

糟糕,抱歉給necro :) – 2011-06-27 01:20:34

回答

0

這聽起來與Wpf treeview bug類似,如果您通過綁定在項目上設置IsSelected,則邏輯焦點將保留在先前選擇的項目中。嘗試使用ListView.ItemContainerGenerator.ContainerFromItem(newlySelectedItem)獲取新選擇的ListViewItem的句柄,然後調用focus()。我真的很想聽聽這是否適合你。