ListBox与ItemsControl项目不占用所有可用空间

时间:2012-02-15 03:36:35

标签: wpf silverlight

很抱歉,如果之前已经回答过;我在这里查看了类似的帖子,但建议的修复程序对我不起作用。

我正在开发一个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似乎忽略了样式属性Horizo​​ntalContentAlignment,即我无法将项目拉伸到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>

2 个答案:

答案 0 :(得分:4)

您应该只使用GridStackPanel仅使用每个元素所需的最小空间。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*">
        <ColumnDefinition Width="*">
    </Grid.ColumnDefinitions>
    <TextBlock Text="{Binding DisplayName}" />
    <TextBox Text="{Binding Value}" Name="{Binding ID}"/>
</Grid>

答案 1 :(得分:2)

我猜你需要将Horizo​​ntalAlignment和Horizo​​ntalContentAlignment属性设置为在TemplateSelector中拉伸。

E.g。

 <ContentPresenter
            Content="{Binding Item}">
            <ContentPresenter.ContentTemplate>
                <DataTemplate>
                    <local:TemplateSelector
                        Content="{Binding}"
                        HorizontalAlignment="Stretch"
                        HorizontalContentAlignment="Stretch">

如前所述,您还应该使用Grid而不是StackPanel