Могу ли я выполнить текстовый поиск с помощью многобинга

StackOverflow https://stackoverflow.com/questions/4750220

  •  13-10-2019
  •  | 
  •  

Вопрос

У меня ниже комбо-коробка в приложении 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>
Это было полезно?

Решение

К сожалению, 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, и если они являются свойствами зависимости, вам придется использовать смену.

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top