Связывание TextBlock на основе выбора в ComboBox

Когда я делаю выбор в ComboBox, а затем набираю некоторый текст в TextBox, я хочу иметь видимый список AutoSuggestion ID или FirstName или LastName (на основе выбора ComboBox), который содержит введенную строку в TextBox. Таким образом, теперь это работает только для FirstName.

У меня проблема как-то установить динамическую привязку для TextBlock. Пожалуйста помоги. Заранее спасибо! Марина

У меня есть ComboBox:

 <ComboBox Height="23" Name="cbAttrib" Width="120" Margin="0,8,0,0">
          <ComboBoxItem>ID</ComboBoxItem>
          <ComboBoxItem>FirstName</ComboBoxItem>
          <ComboBoxItem>LastName</ComboBoxItem>             
  </ComboBox>

У меня есть текстовое поле:

<TextBox Name="txtSearch" TextChanged="txtAutoSuggestName_TextChanged"/>

И этот ListBox:

 <ListBox Name="listBoxSuggestion" Visibility="Hidden" SelectionChanged="ListBox_SelectionChanged">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock DataContext="{Binding FirstName}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

и в коде у меня есть эти методы:

private void txtAutoSuggestName_TextChanged(object sender, TextChangedEventArgs e)
    {
        listBoxSuggestion.Items.Clear();
        if (txtSearch.Text != "")
        {
            ComboBoxItem cb = (ComboBoxItem)cbAttrib.SelectedItem;                
            Collection<Person> namelist = proxy.PersonSearch(txtSearch.Text, cb.Content.ToString());               
            if (namelist.Count > 0)
            {                   
                listBoxSuggestion.Visibility = Visibility.Visible;
                foreach (var obj in namelist)
                {
                    listBoxSuggestion.Items.Add(obj);                        
                }
            }
        }
        else
        {
            listBoxSuggestion.Visibility = Visibility.Hidden;
        }
    }

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count > 0)
        {
            txtSearch.Text = (e.AddedItems[0] as Person).FirstName.ToString();
            listBoxSuggestion.Visibility = System.Windows.Visibility.Hidden;
        }
    }

person marinadra    schedule 06.01.2012    source источник


Ответы (1)


Вы не привязываете Text, поэтому ничего не будет отображаться

Вы просто привязываете DataContext, который ничего не делает если нет дополнительных привязок, которые будут относительно него. Просто замените это (или добавьте Text="{Binding}", который будет привязан к DataContext, который является FirstName), и если ваша логика верна, это должно работать.

(Вместо очистки и добавления к Items следует просто установить ItemsSource вместо listBoxSuggestion.ItemsSource = namelist;)

Изменить: чтобы привязка работала для разных предложений, измените путь привязки на Value и сделайте ItemsSource набором некоторых простых объектов со свойством Value (например, используйте LINQ и анонимные объекты).

person H.B.    schedule 06.01.2012
comment
Да, я уже набрал Text вместо DataContext, это работает, но только для FirstName. Я хочу, чтобы он связывался с идентификатором и фамилией на основе выбора ComboBox - person marinadra; 06.01.2012
comment
@marinadra: Ну, просто измените путь привязки на Value и сделайте ItemsSource набором некоторых простых объектов со свойством Value (например, используйте LINQ и анонимные объекты), вам, вероятно, не понадобится полный Person только для списка предложений, правильно ? - person H.B.; 06.01.2012
comment
Да, это решение. Большое тебе спасибо - person marinadra; 07.01.2012
comment
@marinadra: Если теперь это полностью отвечает на вопрос, вы можете (и должны) принять его. - person H.B.; 07.01.2012