2

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>
4

2 に答える 2

6

残念ながら、TextSearch.TextDataTemplate では機能しません。そうでなければ、あなたはこのようなことをすることができたでしょう

<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>

ただし、これは機能しないため、問題の解決策が 2 つあります。

最初の方法
を に設定IsTextSearchEnabledTrue、ソース クラスComboBoxでオーバーライドして、をに変更します。ToStringMultiBindingTextBlockBinding

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);
    }
    //...
}

第 2 の方法
ToString をオーバーライドしたくない場合は、BidServiceCategoryIdBidServiceCategoryNameを組み合わせるソース クラスに新しいプロパティを導入する必要があると思いますTextSearch.TextPath。この例では、BidServiceCategory と呼びます。OnPropertyChanged("BidServiceCategory");これが機能するには、 whenBidServiceCategoryIdまたはBidServiceCategoryNamechanges も呼び出す必要があります。それらが通常の 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");
        }
    }
}
于 2011-01-20T18:46:05.493 に答える
3

テキスト検索ですべてのテキストを検索する必要があるかどうかはわかりませんが、カテゴリ ID から検索する場合は、TextSearch.TextPath プロパティを BidServiceCategoryId に設定するだけです。これは、マルチバインディングを使用したいが、テキスト検索が機能しなくなったことに気付いた人にも役立つはずです... TextPath プロパティを明示的に設定すると機能します。

于 2011-08-02T15:45:08.720 に答える