很抱歉,如果之前已经回答过;我在这里查看了类似的帖子,但建议的修复程序对我不起作用。
我正在开发一个Silverlight 3项目,我有以下内容:
<ListBox ItemsSource="{Binding}"
ItemTemplate="{StaticResource TemplateSelector}"
>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
ListBox绑定到一个源,它使用我在Silverlight中实现的DataTemplateSelector使用不同的DataTemplates。
ListBox似乎忽略了样式属性HorizontalContentAlignment,即我无法将项目拉伸到ListBox的整个宽度。
我的DataTemplates看起来像这样:
<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>
答案 0 :(得分:4)
您应该只使用Grid
。 StackPanel
仅使用每个元素所需的最小空间。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*">
<ColumnDefinition Width="*">
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding DisplayName}" />
<TextBox Text="{Binding Value}" Name="{Binding ID}"/>
</Grid>
答案 1 :(得分:2)
我猜你需要将HorizontalAlignment和HorizontalContentAlignment属性设置为在TemplateSelector中拉伸。
E.g。
<ContentPresenter
Content="{Binding Item}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<local:TemplateSelector
Content="{Binding}"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch">
如前所述,您还应该使用Grid而不是StackPanel