Извините, если на этот вопрос уже был дан ответ; Я посмотрел подобные посты здесь, но предложенное исправление не работает для меня.
Я работаю над проектом Silverlight 3, и у меня есть следующее:
<ListBox ItemsSource="{Binding}"
ItemTemplate="{StaticResource TemplateSelector}"
>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
ListBox привязан к источнику, который использует различные шаблоны данных, используя DataTemplateSelector, который я реализовал в Silverlight.
Кажется, что ListBox игнорирует свойство стиля HorizontalContentAlignment, т.е. я не могу заставить элементы растягиваться на всю ширину ListBox.
Мои шаблоны данных выглядят так:
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding DisplayName}" />
<TextBox Text="{Binding Value}" Name="{Binding ID}"/>
</StackPanel>
По сути, я хочу, чтобы элементы заполняли все доступное пространство элемента управления ListBox и разделяли их так, чтобы левая половина пространства занимала TextBlock, а правая половина занимала TextBox.
Есть идеи, как это сделать?
РЕДАКТИРОВАТЬ: @wdavo: Вот код TemplateSelector:
// http://www.codeproject.com/Articles/92439/Silverlight-DataTemplateSelector
public abstract class DataTemplateSelector : ContentControl
{
public virtual DataTemplate SelectTemplate(
object item, DependencyObject container)
{
return null;
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
ContentTemplate = SelectTemplate(newContent, this);
}
}
public class MyTemplateSelector : DataTemplateSelector
{
public DataTemplate MyTemplate1 { get; set; }
public DataTemplate MyTemplate2 { get; set; }
public DataTemplate MyTemplate3 { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var element = item;
if (element.GetType() == typeof(MyType1))
return MyTemplate1;
else if (element.GetType() == typeof(MyType2))
return MyTemplate2;
else if (element.GetType() == typeof(MyType3))
return MyTemplate3;
return base.SelectTemplate(item, container);
}
}
и xaml:
<DataTemplate x:Key="TemplateSelector">
<local:MyTemplateSelector Content="{Binding}">
<local:MyTemplateSelector.MyTemplate1>
<DataTemplate>
<StackPanel >
<TextBlock Text="{Binding DisplayName}" />
<TextBox Text="{Binding Value}" Name="{Binding ID}" />
</StackPanel>
</DataTemplate>
</local:MyTemplateSelector.MyTemplate1>
... and so on
</local:MyTemplateSelector>
</DataTemplate>