1

プログラムで ListBox に追加しようとしているカスタム ListBoxItem があり、アイテムの内容をラップしたいです。

カスタム ListBoxItem は次のとおりです。

class PresetListBoxItem : ListBoxItem
{
    public uint[] preset;

    public PresetListBoxItem(uint[] preset = null, string content = "N/A")
        : base()
    {
        this.preset = preset;
        this.Content = content;
    }
}

そしてXAML:

<ListBox Name="sortingBox" Margin="5,5,0,5" Width="150" MaxWidth="150" ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="Black" BorderThickness="2" CornerRadius="3" Margin="3">
                <TextBlock Text="{Binding Path=Text}" TextWrapping="WrapWithOverflow" />
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

そして、追加を行うコード:

PresetListBoxItem item = new PresetListBoxItem();
item.preset = new uint[] { };
item.Content = "This is a test of an extended line of text.";
sortingBox.Items.Add(item);

コードを実行すると、アイテムがボックスに追加されますが、境界線がまったく表示されず、行が折り返されません。

私は答えを求めて SO と Google を調べ、ListBoxes と ListViews の両方を使用しましたが、何も機能していないようです。

4

1 に答える 1

0

ListBoxItemコンテンツそれぞれのアイテムの単なるコンテナです。独自のListBoxItemオーバーライドを使用する場合は、アイテムではなくコンテナのテンプレートをオーバーライドします。次に、適切なバインディングのために、PresetListBoxItemTextBlockのプロパティにバインドする必要があります。Content

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:PresetListBoxItem">
                    <Border BorderBrush="Black" BorderThickness="2" CornerRadius="3" Margin="3">
                        <TextBlock Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType=local:PresetListBoxItem}}"
                                   TextWrapping="WrapWithOverflow" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ListBox.ItemContainerStyle>

しかし、それは最善の方法ではないと思います。なぜあなたはから派生したのListBoxItemですか?これを行わないと、XAML はすぐに問題なくなります。

item.Text = "This is a test of an extended line of text.";

class PresetListBoxItem
{
    public uint[] preset;
    public string Text { get; set; }

    public PresetListBoxItem(uint[] preset = null, string content = "N/A")
      : base()
    {
        this.preset = preset;
        this.Text = content;
    }
}
于 2012-05-23T02:35:36.427 に答える