我通过键入在WPF ListBox中找到一个项目

时间:2011-01-09 10:59:18

标签: wpf listbox

你想通过打字找到列表框中的一个项目,我找到很多例子,但我觉得我做的很糟糕。

我绑定到列表框我的字典。朋友是我的班级,看起来像这样:

 [JsonObject]
    [Export]
    public class Friend
    {
        public override string ToString()
        {
            return Nick;
        }

        [JsonProperty("idUser")]
        public string IdUser { get; set; }

        [JsonProperty("nick")]
        public string Nick { get; set; }

        [JsonProperty("sefNick")]
        public string SefNick { get; set; }

        [JsonProperty("isFriend")]
        public bool IsFriend { get; set; }

        [JsonProperty("status")]
        public int Status { get; set; }

    }

我在列表框上有自己的数据模板:

 <Style x:Key="friendsListStyle" TargetType="{x:Type ListBox}">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid Name="RootLayout">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="0.3*"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="60"></RowDefinition>
                        </Grid.RowDefinitions>
                        <Image Margin="4,4,4,2" Grid.Column="0">
                            <Image.Source >
                                <MultiBinding Converter="{StaticResource imageConverter}">
                                    <Binding Path="Value.ProfilePhoto"></Binding>
                                    <Binding Path="Value.Status"></Binding>
                                </MultiBinding>
                            </Image.Source>
                        </Image>
                        <Grid  Grid.Column="1">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"></RowDefinition>
                                <RowDefinition Height="*"></RowDefinition>
                                <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>
                            <TextBlock 
                                   Text="{Binding Value.Nick}" 
                                   Margin="2,2,2,2" 
                                   FontSize="13" 
                                   FontWeight="Medium"
                                   Grid.Column="0" Grid.Row="0">
                            </TextBlock>
                            <TextBlock  
                                   Text="{Binding Value.BlockQuote}"
                                   FontSize="11" 
                                   FontWeight="Normal" 
                                   Foreground="DarkGray"
                                   Grid.Column="0" Grid.Row="1" Margin="2,2,2,2"></TextBlock>
                            <TextBlock  
                                   Text="{Binding Value.Status,Converter={StaticResource statusConverter}}"
                                   Style="{StaticResource StatusStyle}"
                                   Grid.Column="0" Grid.Row="2" >
                            </TextBlock>
                        </Grid>
                    </Grid>
                    <DataTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="LayoutTransform" TargetName="RootLayout">
                            <Setter.Value>
                                <ScaleTransform ScaleX="1.25" ScaleY="1.25" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </Setter.Value>

我在listbox上应用此模板:

<ListBox Name="Friends" 
         SelectedIndex="{Binding Path=SelectedFriendsIndex,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         SelectedItem="{Binding Path=SelectedFriend, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
         Style="{DynamicResource friendsListStyle}"
         IsTextSearchEnabled="True" TextSearch.TextPath="Nick"
</ListBox>

我启用文本搜索我想通过Nick搜索,Nick是朋友类的字符串属性:

IsTextSearchEnabled="True" TextSearch.TextPath="Nick"

但它不起作用。我的例子我只发现你必须启用IsTextSearchEnabled并在item对象的字符串属性上设置TextSearch.TextPath。

我做得不好。感谢您的建议。

1 个答案:

答案 0 :(得分:2)

ListBox的ItemsSource是朋友的集合,例如ObservableCollection<Friend>吗? 在这种情况下,您不应在Value.等绑定中使用Text="{Binding Value.Nick}"。它应该只是Text="{Binding Nick}"。否则,如果ItemsSource确实是其他内容,Nick位于名为Value的Property中,那么在设置TextSearch.TextPath时必须考虑到这一点,因此TextSearch.TextPath="Value.Nick"。除此之外,TextSearch工作得很好。