6

次のような ListBox があります。

<ListBox ItemsSource="{Binding Fruits}">
    <!--Make the items wrap--> 
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel></WrapPanel>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name, StringFormat=' {0},'}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

これにより、次のようなリストが得られます。

オレンジ、ブドウ、バナナ、

しかし、私が欲しいのは:

オレンジ、ブドウ、バナナ

(末尾のカンマなし)

末尾のコンマを削除する方法を知っている人はいますか?

4

2 に答える 2

5

これは、IValueConverterを使用して、そのlast item in a listBox and there by updating StringFormat on your binding using data trigger in XAML.

値がリストボックスの最後の項目かどうかを判断するコンバーターを作成します -

public class IsLastItemInContainerConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                          CultureInfo culture)
    {
        DependencyObject item = (DependencyObject)value;
        ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);

        return ic.ItemContainerGenerator.IndexFromContainer(item) ==
                                                        ic.Items.Count - 1;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                              CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML を変更し、DataTemplate にトリガーを追加して、TextBlock の StringFormat からコンマを削除します。

<ListBox ItemsSource="{Binding Fruits}">
   <ListBox.Resources>
      <local:IsLastItemInContainerConverter
             x:Key="IsLastItemInContainerConverter"/>
   </ListBox.Resources>
   <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
         <WrapPanel/>
      </ItemsPanelTemplate>
   </ListBox.ItemsPanel>
   <ListBox.ItemTemplate>
      <DataTemplate>
         <TextBlock x:Name="textBlock"
                    Text="{Binding Name, StringFormat=' {0},'}" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource 
                                               Mode=FindAncestor, 
                                               AncestorType=ListBoxItem},
                                               Converter={StaticResource IsLastItemInContainerConverter}}" 
                             Value="True">
                    <Setter Property="Text" TargetName="textBlock"
                            Value="{Binding Name, StringFormat=' {0}'}"/>
                 </DataTrigger>
            </DataTemplate.Triggers>
       </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>
于 2013-11-01T19:43:58.590 に答える
1

コードをリファクタリングすると、目的の結果を持つ文字列を非常に簡単に作成できます。

string.Join(", ", Fruits) // e.g. Oranges, Grapes, Bananas

たとえば、次のことができます。

// on your binding object
public string FruitString { get { return string.Join(", ", Fruits); } }
// in your XAML
<TextBlock Text="{Binding FruitString}" />

(または、Fruitsプロパティが定義したクラスのものである場合は、その をオーバーライドできますToString()。これは、コードを配置するのに適した場所Joinです)

于 2013-11-01T19:11:58.480 に答える