Могу ли я сделать текстовый поиск с несколькими привязками
У меня есть ниже поле со списком в приложении 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>
2 ответа
К несчастью, 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");
}
}
}
Я не знаю, должен ли ваш текстовый поиск искать ВЕСЬ текст, но если вы хотите искать по идентификатору категории, вы можете просто установить свойство TextSearch.TextPath в BidServiceCategoryId. Это также должно быть полезно для тех, кто хочет использовать мультисвязывание и обнаруживает, что текстовый поиск больше не работает... Он работает, если вы явно установили свойство TextPath.