2012-01-05 11 views
0

私が取り組む機能は、キーワード検索のために自動補完されています。ユーザーが検索バーに何かを入力するとすぐに、ビューモデルはautocomplete apiをキーワードパラメータで呼び出して自動補完候補を取得し、observablecollectionコンテナに入れます。このobservablecollectionは依存関係のプロパティであり、リストボックスと結合してオートコンプリート候補を表示します。私の問題は、依存関係のプロパティが正しく設定されているが、リストボックスに何も表示されないということです。以下のいくつかのコードの断片です:xaml.csに結合依存関係プロパティobservablecollectionによってリストボックスが更新されない

データ:それはだ、

private void searchBar_TextChanged(object sender, TextChangedEventArgs e) 
     { 
      _searchViewModel.getTypeaheadListFromServer(searchBar.Text); 
     } 

ビューモデルにおける依存関係プロパティ:

protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      searchBar.Focus(); 
      _searchViewModel = new SearchViewModel(); 
      DataContext = _searchViewModel; 
     } 

オートコンプリートAPIを呼び出すためにビューモデルにメソッドを呼び出します首尾人口:XAMLでバインディング

public ObservableCollection<TypeaheadElement> TypeaheadList 
     { 
      get { return (ObservableCollection<TypeaheadElement>)GetValue(TypeaheadListProperty); } 
      set { SetValue(TypeaheadListProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for TypeaheadList. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty TypeaheadListProperty = 
      DependencyProperty.Register("TypeaheadList", typeof(ObservableCollection<TypeaheadElement>), typeof(SearchViewModel), new PropertyMetadata(null)); 

データ:

<ListBox Name="typeahead" Grid.Row="1" ItemsSource="{Binding TypeaheadList}" Height="518" Margin="0,0,0,-518" SelectionChanged="typeahead_SelectionChanged"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <TextBlock TextWrapping="Wrap" Text="{Binding TypeaheadElementStr}" FontSize="{StaticResource ListItemFontSize}" FontFamily="Segoe WP" Margin="10,0,0,0" VerticalAlignment="Top"> 
             <TextBlock.Foreground> 
               <SolidColorBrush Color="{StaticResource ListItemFontColor}"/> 
             </TextBlock.Foreground> 
           </TextBlock> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 

ありがとうございました!

答えて

0

この

<ListBox Name="typeahead" Grid.Row="1" ItemsSource="{Binding TypeaheadList, UpdateSourceTrigger=PropertyChanged}" Height="518" Margin="0,0,0,-518" SelectionChanged="typeahead_SelectionChanged"> 
+1

こんにちはハリス、本当にありがとうございます。しかし、updatesourcetriggerを追加した後、そのページに移動すると次のようなエラーが表示されます。 'PropertyChanged'テキストから 'System.Windows.Data.UpdateSourceTrigger'を作成できませんでした。助言がありますか?ありがとう! –

+0

'DependencyProperty.Register'の最後のパラメータを' new FrameworkPropertyMetadata( null、 FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 'に変更してみてください。 –

+0

こんにちは、ハリスさん、ありがとうございます。私はFrameworkPropertyMetadataを使用しようとしましたが、 "FrameworkPropertyMetadataが名前空間System.Windowsに存在しません"という文句を言います。しかし、私はmsdn docをチェックし、FrameworkPropertyMetadataクラスはSystem.Windowsのすぐ下にあります。何が起きているのか?新しい質問をしておきながら申し訳ありません。ありがとう! –

0

を試してみてくださいあなたはDependencyPropertyこの状況で実装しようと、なぜ私は理解していません。 TypeaheadListBindingのソースであり、ターゲットではありません。だから、あなたのViewModelの単純な財産かもしれません。

0

ツールキットからオートコンプリートボックスを試しましたか?可能性のリストが大きければ、AutoCompleteBoxのItemsSourceをあらかじめ設定することができます。あらかじめ設定しておくことができない場合は、サーバーに非同期要求を発行して、アプリケーションの起動時にすべての可能性を得ることができます。

XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <toolkit:AutoCompleteBox ItemsSource="{Binding People}" Populating="AutoCompleteBox_Populating" /> 
    </Grid> 

コード:

public partial class MainPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MainPage() 
    { 
     People = new ObservableCollection<string> {"Shawn", "steve", "Bob", "randy", "mike"}; 
     DataContext = this; 
     InitializeComponent(); 
    } 

    public ObservableCollection<string> People { get; set; } 

    private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e) 
    { 
     // Have we already populated with this text? 
     if(People.Any(person => person.ToLower().StartsWith(e.Parameter.ToLower()))) return; 

     Completer c = new Completer(); 
     c.Completed += new EventHandler<EventArgs>(c_Completed); 
     c.Complete(e.Parameter); 
    } 

    void c_Completed(object sender, EventArgs e) 
    { 
     Completer c = sender as Completer; 
     foreach (var name in c.Names) 
     { 
      People.Add(name);  
     } 
    } 
} 

internal class Completer 
{ 
    public event EventHandler<EventArgs> Completed; 

    public IEnumerable<string> Names { get; set; } 

    public void Complete(string parameter) 
    { 
     if (parameter.StartsWith("d")) 
     { 
      Names = new List<string>() { "Dick", "Dave" }; 
     } 
     else if (parameter.StartsWith("j")) 
     { 
      Names = new List<string>() { "Jane", "Joe" }; 
     } 
     OnCompleted(); 
    } 

    protected virtual void OnCompleted() 
    { 
     var handler = Completed; 
     if (handler != null) handler(this, EventArgs.Empty); 
    } 
} 
それが不可能な場合は、次のような何かを行うことができ http://www.jeff.wilcox.name/2011/03/acb-in-pivot/

: ここAutoCompleteBoxの使用に関するいくつかのブログです

+0

こんにちはショーン、本当にあなたの返信に感謝します。しかし、私は私のオートコンプリートapiは、例とは少し異なると思います。ユーザーが入力した内容に基づいてオートコンプリートを返します。たとえば、すべての製品名が返されるわけではありませんが、「ip」がサーバーに送信された場合、「iphone、 ipod、ipad ... "と表示されます。 –

+0

(最後のコメントを続ける)この場合、私は私の元の方法に固執すべきだと思う。ユーザーが何かを入力するたびにオートコンプリートのリストボックスをビューモデルのプロパティにバインドし、APIを呼び出してオートコンプリートを取得してプロパティを設定します。しかし、私の問題は、プロパティが設定されていますが、リストボックスは更新されません。 = –

+0

こんにちはShawnさん、この問題を解決しました。ありがとうございました!ありがとうございました! –

関連する問題