【问题标题】:Can I do Text search with multibinding我可以使用多重绑定进行文本搜索吗
【发布时间】:2011-06-12 14:55:30
【问题描述】:

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

【问题讨论】:

    标签: wpf text mvvm multibinding


    【解决方案1】:

    我不知道您的文本搜索是否必须搜索所有文本,但如果您想从类别 ID 进行搜索,您只需将 TextSearch.TextPath 属性设置为 BidServiceCategoryId。这对于想要使用多重绑定并发现文本搜索不再有效的任何人也应该有所帮助...如果您明确设置 TextPath 属性,它确实有效。

    【讨论】:

      【解决方案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>
      

      但是这不起作用,所以我看到了两种解决您问题的方法。

      第一种方式
      您将ComboBoxIsTextSearchEnabled 设置为True,覆盖源类中的ToString,并将TextBlock 中的MultiBinding 更改为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,我认为您必须在源类中引入一个新属性,在其中将 BidServiceCategoryIdBidServiceCategoryName 组合为 TextSearch.TextPath。在此示例中,我将其称为 BidServiceCategory。为此,当BidServiceCategoryIdBidServiceCategoryName 也发生变化时,您必须调用OnPropertyChanged("BidServiceCategory");。如果它们是普通的 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");
              }
          }
      }
      

      【讨论】:

      • 第一种方法..对我不起作用...它不显示。只有对象被显示..不是那个值
      • @Anish Mohan:您是否检查过 ToString 方法是否在调试器中被命中?如果是这样,它返回什么值?你认为如果我上传我的示例项目会有帮助吗?
      • 嗨,ToString 没有被调用。
      • DataContext 是 BenefitCategoryList,它似乎是 BenefitCategory 实例之类的集合,对吗?在这种情况下,BenefitCategory 的一个实例应该是每个 ComboBoxItem 的 DataContext,并且应该调用 ToString 来呈现每个项目。我不确定这里缺少什么。您可以发布源类的源代码吗?
      • YEs ...但是 BenefitCategory 是一个 dto ...我在那里添加了 ToString 方法。但它从来没有叫过。我认为..我们必须在视图模型中拥有这两个属性...并且 ToSting 应该在视图模型中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多