2012-02-15 27 views
2

对不起,如果这之前已被回答;我在这里看过类似的帖子,但建议的修复程序不适合我。ListBox或ItemControl项不占用所有可用空间

我工作的一个Silverlight 3的项目,我有以下几点:

<ListBox ItemsSource="{Binding}" 
     ItemTemplate="{StaticResource TemplateSelector}" 
     > 
    <ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
    </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

列表框绑定到一个源,它使用不同的DataTemplates使用DataTemplateSelector我在Silverlight中实现。

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

我猜你需要设置的Horizo​​ntalAlignment和Horizo​​ntalContentAlignment属性您TemplateSelector内伸展。

E.g.

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

如前所述,你应该还你一个网格,而不是一个StackPanel

+0

感谢您的回答。我在哪里放这个ContentPresenter对象?它是我的DataTemplate选择器的孩子吗?或父母? – krebstar 2012-02-15 04:02:32

+0

我认为你只需要将Horizo​​ntalAlignment和Horizo​​ntalContentAlignment属性添加到你的 wdavo 2012-02-15 04:04:07

+1

谢谢,这个伎俩。 (将Horizo​​ntalAlignment和Horizo​​ntalContentAlignment添加到TemplateSelector中,并使用Grid而不是StackPanel。使用StackPanel不起作用 – krebstar 2012-02-15 04:10:54

4

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

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

将尝试此操作.. – krebstar 2012-02-15 04:04:36

+0

这与wdavo的建议结合在模板选择器中设置对齐。 – krebstar 2012-02-15 04:11:27

+0

Just一个问题..如果我有这样的话,当我输入更多的文本比文本框可以处理的文本框扩展。它吃我的文本块的一半..有没有一种方法来明确告诉网格设置每个项目使用一半的空间? – krebstar 2012-02-15 04:32:57

相关问题