2011-01-20 4 views
1

У меня есть следующее поле со списком в приложении mvvm-wpf. Мне нужно реализовать «Текстовый поиск» в этом .. (наряду с многосвязным). Может кто-нибудь мне помочь.Могу ли я выполнять поиск по тексту с многосвязью

<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="Bid Service Cat ID" 
       Margin="2"></TextBlock> 
    <ComboBox Width="200" 
       Height="20" 
       SelectedValuePath="BidServiceCategoryId" 
       SelectedValue="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, 
        Path=DataContext.SelectedBidServiceCategoryId.Value}" 
       ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, 
        Path=DataContext.BenefitCategoryList}" 
       Margin="12,0"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock DataContext="{Binding}"> 
          <TextBlock.Text> 
           <MultiBinding StringFormat="{}{0}: {1}"> 
           <Binding Path="BidServiceCategoryId" /> 
           <Binding Path="BidServiceCategoryName" /> 
          </MultiBinding> 
          </TextBlock.Text></TextBlock> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
</StackPanel> 

ответ

6

К сожалению, TextSearch.Text не работает в DataTemplate. В противном случае вы могли бы сделать что-то вроде этого

<ComboBox ...> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Setter Property="TextSearch.Text"> 
       <Setter.Value> 
        <MultiBinding StringFormat="{}{0}: {1}"> 
         <Binding Path="BidServiceCategoryId"/> 
         <Binding Path="BidServiceCategoryName"/> 
        </MultiBinding> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

Однако это не сработает, поэтому я вижу два решения вашей проблемы.

Первый способ
Вы устанавливаете IsTextSearchEnabled в True для ComboBox, переопределить ToString в классе источника и изменить MultiBinding в TextBlock к Binding

Xaml

<ComboBox ... 
      IsTextSearchEnabled="True"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 

Исходный класс

public class TheNameOfYourSourceClass 
{ 
    public override string ToString() 
    { 
     return String.Format("{0}: {1}", BidServiceCategoryId, BidServiceCategoryName); 
    } 
    //... 
} 

Второй путь
Если вы не хотите, чтобы переопределить ToString Я думаю, вы должны ввести новое свойство в классе источника, где вы объедините BidServiceCategoryId и BidServiceCategoryName для TextSearch.TextPath , В этом примере я называю это BidServiceCategory. Для этого вам нужно будет позвонить OnPropertyChanged("BidServiceCategory");, когда изменится BidServiceCategoryId или BidServiceCategoryName. Если они нормальные CLR свойства, вы можете сделать это в set, и если они являются свойства зависимостей, вам придется использовать свойство изменилось CallBack

Xaml

<ComboBox ... 
      TextSearch.TextPath="BidServiceCategory" 
      IsTextSearchEnabled="True"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock DataContext="{Binding}"> 
       <TextBlock.Text> 
        <MultiBinding StringFormat="{}{0}: {1}"> 
         <Binding Path="BidServiceCategoryId" /> 
         <Binding Path="BidServiceCategoryName" /> 
        </MultiBinding> 
       </TextBlock.Text> 
      </TextBlock> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 

Источник класс

public class TheNameOfYourSourceClass 
{ 
    public string BidServiceCategory 
    { 
     get 
     { 
      return String.Format("{0}: {1}", BidServiceCategoryId, BidServiceCategoryName); 
     } 
    } 

    private string m_bidServiceCategoryId; 
    public string BidServiceCategoryId 
    { 
     get 
     { 
      return m_bidServiceCategoryId; 
     } 
     set 
     { 
      m_bidServiceCategoryId = value; 
      OnPropertyChanged("BidServiceCategoryId"); 
      OnPropertyChanged("BidServiceCategory"); 
     } 
    } 

    private string m_bidServiceCategoryName; 
    public string BidServiceCategoryName 
    { 
     get 
     { 
      return m_bidServiceCategoryName; 
     } 
     set 
     { 
      m_bidServiceCategoryName = value; 
      OnPropertyChanged("BidServiceCategoryName"); 
      OnPropertyChanged("BidServiceCategory"); 
     } 
    } 
} 
+0

Первый способ .. не работает для меня ... он не отображается. Только объект получает отображаемое. Не значение в этом – Relativity

+0

@Anish Mohan: вы проверили, попадает ли метод ToString в отладчик? Если да, какое значение оно возвращает? Как вы думаете, это поможет, если я загружу свой образец проекта? –

+0

Привет, ToString не вызвано. – Relativity

2

Я не знаю, должен ли ваш текстовый поиск искать ВСЕ текст, но если вы хотите найти из идентификатора категории, вы можете просто установить TextSearch.TextPa го имущества в BidServiceCategoryId. Это также должно быть полезно для тех, кто хочет использовать многосвязывание и обнаруживает, что текстовый поиск больше не работает ... Он работает, если вы явно задали свойство TextPath.

Смежные вопросы