none
求教一个绑定listbox模板的问题 RRS feed

  • 问题

  • 我的一个listbox绑定了一个类的集合,然后用datatemplate来实现内容,如下所示

    	<Window.Resources>
    		<my:ListRe x:Key="listRe"/>
    		<DataTemplate x:Key="dataTemplate">
                    <Button x:Name="button" Height="20" Background="Transparent"  Click="Button_Click"  Tag="{Binding Availible}">
                    	<Button.Content>
                     		<TextBlock TextAlignment="Center"  Background="Red" 
    						Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"
    						 Text="{Binding Availible}"></TextBlock>
    	</Button.Content>
                    </Button>
            </DataTemplate>
    	</Window.Resources>
        <Grid>
                <ListBox x:Name="listbox_Functions" Grid.Column="0"
                         HorizontalContentAlignment="Stretch"
    					 Background="Gray"
    					 ItemTemplate="{StaticResource dataTemplate}"
    					 ItemsSource="{Binding Source={StaticResource listRe}}">
                </ListBox>
        </Grid>
    </Window>

    其中Availible=1,一共六行。目的是居中显示1,背景为红色,但是最后出来的是这个效果

    觉得有点莫名其妙呀

    2014年4月26日 9:57

答案

  • 问题出在:

    Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"

    不应该把TextBlock的宽度绑定到Button的实际宽度,因为Button的宽度默认是Auto,这其实是和Button的Content的宽度有关的,就是说Button的计算实际宽度时会考虑Content的实际宽度,而经过你的绑定后,Content的实际宽度又和Button的宽度有关,这就导致矛盾。即Button的宽度依赖于TextBlock的宽度,而TextBlock的宽度又依赖于Button的宽度,死循环了。去掉这个绑定既可。

    如果想让TextBlock的宽度和Button一样,设置Button的HorizontalContentAlignment="Stretch"即可:

    <Button x:Name="button" HorizontalContentAlignment="Stretch" Height="20" Background="Transparent"  Click="Button_Click"  Tag="{Binding Availible}">

    2014年4月26日 12:28
  • 这就奇怪了,我怎么跑出来和你不一样

    	<Window.Resources>
    		<my:ListRe x:Key="listRe"/>
    		<DataTemplate x:Key="dataTemplate">
                    <Button x:Name="button" Height="20" HorizontalAlignment="Stretch" Background="Transparent"  Click="Button_Click"  Tag="{Binding Availible}">
                    	<Button.Content>
                     		<TextBlock TextAlignment="Center"  Background="Red" 
    						Text="{Binding Availible}"></TextBlock>
    	</Button.Content>
                    </Button>
            </DataTemplate>
    	</Window.Resources>
        <Grid>
                <ListBox x:Name="listbox_Functions" Grid.Column="0"
                         HorizontalContentAlignment="Stretch"
    					 Background="Gray"
    					 ItemTemplate="{StaticResource dataTemplate}"
    					 ItemsSource="{Binding Source={StaticResource listRe}}">
                </ListBox>
        </Grid>
    </Window>

    因为要使用HorizontalContentAlignment而不是HorizontalAlignment
    2014年4月26日 14:13

全部回复

  • 问题出在:

    Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"

    不应该把TextBlock的宽度绑定到Button的实际宽度,因为Button的宽度默认是Auto,这其实是和Button的Content的宽度有关的,就是说Button的计算实际宽度时会考虑Content的实际宽度,而经过你的绑定后,Content的实际宽度又和Button的宽度有关,这就导致矛盾。即Button的宽度依赖于TextBlock的宽度,而TextBlock的宽度又依赖于Button的宽度,死循环了。去掉这个绑定既可。

    如果想让TextBlock的宽度和Button一样,设置Button的HorizontalContentAlignment="Stretch"即可:

    <Button x:Name="button" HorizontalContentAlignment="Stretch" Height="20" Background="Transparent"  Click="Button_Click"  Tag="{Binding Availible}">

    2014年4月26日 12:28
  • 感谢回复。

    但是我有个问题

    如果按照你的说法实现之后,我发现textblock的width仍然是和textblock.Text是一样的,我的背景颜色的长度说明了这点,如下图

    我的需求是TextBlock和Button(也就是他的父容器)一样宽,谢谢。

    2014年4月26日 13:27
  • 感谢回复。

    但是我有个问题

    如果按照你的说法实现之后,我发现textblock的width仍然是和textblock.Text是一样的,我的背景颜色的长度说明了这点,如下图

    我的需求是TextBlock和Button(也就是他的父容器)一样宽,谢谢。

    是否有设置Button的HorizontalContentAlignment="Stretch"?

    <Button x:Name="button" HorizontalContentAlignment="Stretch" Height="20" Background="

    我试了一下你的xaml文件,把textblock的width的绑定去掉并设置Button的HorizontalContentAlignment="Stretch"后,得到的结果如下:

    2014年4月26日 13:42
  • 这就奇怪了,我怎么跑出来和你不一样

    	<Window.Resources>
    		<my:ListRe x:Key="listRe"/>
    		<DataTemplate x:Key="dataTemplate">
                    <Button x:Name="button" Height="20" HorizontalAlignment="Stretch" Background="Transparent"  Click="Button_Click"  Tag="{Binding Availible}">
                    	<Button.Content>
                     		<TextBlock TextAlignment="Center"  Background="Red" 
    						Text="{Binding Availible}"></TextBlock>
    	</Button.Content>
                    </Button>
            </DataTemplate>
    	</Window.Resources>
        <Grid>
                <ListBox x:Name="listbox_Functions" Grid.Column="0"
                         HorizontalContentAlignment="Stretch"
    					 Background="Gray"
    					 ItemTemplate="{StaticResource dataTemplate}"
    					 ItemsSource="{Binding Source={StaticResource listRe}}">
                </ListBox>
        </Grid>
    </Window>
    

    2014年4月26日 14:08
  • 这就奇怪了,我怎么跑出来和你不一样

    	<Window.Resources>
    		<my:ListRe x:Key="listRe"/>
    		<DataTemplate x:Key="dataTemplate">
                    <Button x:Name="button" Height="20" HorizontalAlignment="Stretch" Background="Transparent"  Click="Button_Click"  Tag="{Binding Availible}">
                    	<Button.Content>
                     		<TextBlock TextAlignment="Center"  Background="Red" 
    						Text="{Binding Availible}"></TextBlock>
    	</Button.Content>
                    </Button>
            </DataTemplate>
    	</Window.Resources>
        <Grid>
                <ListBox x:Name="listbox_Functions" Grid.Column="0"
                         HorizontalContentAlignment="Stretch"
    					 Background="Gray"
    					 ItemTemplate="{StaticResource dataTemplate}"
    					 ItemsSource="{Binding Source={StaticResource listRe}}">
                </ListBox>
        </Grid>
    </Window>

    因为要使用HorizontalContentAlignment而不是HorizontalAlignment
    2014年4月26日 14:13
  • 多谢,是我没看仔细,不好意思
    2014年4月26日 14:19