Wordwrap para ListBoxes personalizados agregados programáticamente

Tengo un ListBoxItem personalizado que estoy tratando de agregar mediante programación a un ListBox, y quiero que se ajuste el contenido del elemento.

Aquí está el ListBoxItem personalizado:

class PresetListBoxItem : ListBoxItem
{
    public uint[] preset;

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

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

Y el código que hace la adición:

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

Cuando ejecuto el código, el elemento se agrega al cuadro, pero el borde no aparece en absoluto y no envuelve las líneas.

Busqué la respuesta en SO y Google, y usé ListBoxes y ListViews, pero nada parece funcionar.

preguntado el 22 de mayo de 12 a las 21:05

1 Respuestas

ListBoxItem es solo un contenedor para el contenido, respectivamente, elemento. Si desea utilizar su propia ListBoxItem anula la plantilla del contenedor, no el artículo. Luego, para el enlace correcto en TextBlock tienes que unirte a la Content propiedad de su PresetListBoxItem.

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

Pero creo que no es la mejor manera. ¿Por qué derivas de ListBoxItem? Si no hace esto, su XAML estaría bien al instante.

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

contestado el 23 de mayo de 12 a las 03:05

Estoy usando una clase personalizada que se deriva de ListBoxItem porque necesito obtener el uint[] asociado cuando alguien selecciona ese elemento en ListBox. La única otra forma en que puedo pensar en hacerlo es vincular de alguna manera un índice a una Lista con ListBoxItem, y eso parece una forma propensa a errores de hacer las cosas. - abion47

Encontrará su clase con uint[] en el DataContext de ListBoxItem. - LPL

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.