Могу ли я сделать текстовый поиск с несколькими привязками - PullRequest
2 голосов
/ 20 января 2011

У меня ниже поле со списком в приложении 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 ]

6 голосов
/ 20 января 2011

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

<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");
        }
    }
}
3 голосов
/ 02 августа 2011

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

...