在VM中跟踪auto-height-row的ActualHeight

时间:2014-08-07 05:23:21

标签: c# wpf mvvm itemscontrol

如果以下任何代码格式不正确,我们深表歉意。我是通过手机发布的,因为我的wifi现在遇到了麻烦。

我希望能够做出这样的事情(我知道这样做不可能):

...
<RowDefinition Height="Auto" ActualHeight="{Binding RowHeight, Mode="OneWayToSource"}"/>
...

所以,基本上高度是自动的(因为其中可能的项目数量(例如Label)是0-n - 使用ItemsControl表示),但我需要知道项目控件的确切高度(在这种情况下) ,它是行来计算&#34;页面的数量&#34;需要代表我的数据。就像ms中的页面一样。

然而,命名行(theRow.ActualHeight)是不可能的,因为VM / MVVM一般不应该这样做(我不能直接访问视图)

知道怎么做吗?感谢。

1 个答案:

答案 0 :(得分:1)

这就是我所拥有的,似乎有效。另外,我复制了this帖子中的SizeObserver

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Text="This is row 1" Grid.Row="0"></TextBlock>
    <ItemsControl Grid.Row="1" 
                  vm:SizeObserver.Observe="True" 
                  vm:SizeObserver.ObservedHeight="{Binding ActHeight, Mode=OneWayToSource}">
        <TextBlock Text="1"></TextBlock>
        <TextBlock Text="2"></TextBlock>
        <TextBlock Text="3"></TextBlock>
        <TextBlock Text="4"></TextBlock>
        <TextBlock Text="5"></TextBlock>
        <TextBlock Text="6"></TextBlock>
    </ItemsControl>
    <TextBlock Text="This is row 3"
               Grid.Row="2"></TextBlock>
</Grid>

在我的视图模型中:

public double ActHeight
{
    get
    {
        return _height;
    }
    set
    {
        _height = value;
    }
}

因为ItemsControl是第1行中唯一的元素,我们知道行的定义或行的高度将是行内控件的实际高度 - ItemsControl