WPF中的ListView未填充所有可用空间

时间:2015-01-19 16:01:02

标签: c# wpf xaml

如何在WPF中创建ListView填充所有可用空间?我尝试过很多很多东西,但都没有。

最近我尝试将ListView嵌套在DockPanel中,然后使用ListView上的绑定来获取DockPanel的ActualHeight。这很好用,但容器中还有其他控件,需要适应它们。

我真的不想编写OnControlLoaded()和OnControlResized()事件并在代码中调整ListView的大小。我该怎么办?

这是XAML,第10行有违规的SortableListView。

    <DockPanel>
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="15 5 5 5">
            <Button x:Name="btnAddCost" Padding="3" ToolTip="Add Cost" Margin="0 0 5 0" Click="btnAddCost_Click"  >
                Add Cost
            </Button>
            <Button x:Name="btnDeleteCost" Padding="3" ToolTip="Delete Cost" Margin="0 0 5 0" Click="btnDeleteCost_Click" IsEnabled="{Binding ElementName=lvCosts, Path=SelectedItem, Converter={StaticResource falseWhenNullConverter}}" >
                Delete Cost
            </Button>
        </StackPanel>
        <ctrls:SortableListView DockPanel.Dock="Top" x:Name="lvCosts" Margin="1" SelectionMode="Single" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
ContextMenuOpening="lvCosts_ContextMenuOpening"
DefaultActionSelected="lvCosts_DefaultActionSelected" MouseDoubleClick="lvCosts_MouseDoubleClick"
ItemsSource="{Binding Booking.AdditionalCosts}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Category" Width="100" DisplayMemberBinding="{Binding Path=Category.Name}" ctrls:SortableListView.SortPropertyName="Category">
                    </GridViewColumn>
                    <GridViewColumn Header="Supplier" Width="110" DisplayMemberBinding="{Binding Path=Supplier}" ctrls:SortableListView.SortPropertyName="Supplier">
                    </GridViewColumn>
                    <GridViewColumn Header="Buy Currency" Width="100" DisplayMemberBinding="{Binding Path=BuyCurrency.Name}" ctrls:SortableListView.SortPropertyName="BuyCurrency">
                    </GridViewColumn>
                    <GridViewColumn Header="Buy Price" Width="110" DisplayMemberBinding="{Binding Path=BuyPrice}" ctrls:SortableListView.SortPropertyName="BuyPrice">
                    </GridViewColumn>
                    <GridViewColumn Header="Sell Currency" Width="100" DisplayMemberBinding="{Binding Path=SellCurrency.Name}" ctrls:SortableListView.SortPropertyName="SellCurrency">
                    </GridViewColumn>
                    <GridViewColumn Header="Sell Price" Width="110" DisplayMemberBinding="{Binding Path=SellPrice}" ctrls:SortableListView.SortPropertyName="SellPrice">
                    </GridViewColumn>
                    <GridViewColumn Header="Margin" Width="180" DisplayMemberBinding="{Binding Path=Margin}" ctrls:SortableListView.SortPropertyName="Margin">
                    </GridViewColumn>
                </GridView>
            </ListView.View>
            <ListView.ContextMenu>
                <ContextMenu x:Name="mnuCostOptions" >
                    <MenuItem x:Name="mniAddCost" Header="_Add Cost" Click="mniAddCost_Click" ></MenuItem>
                    <MenuItem x:Name="mniEditCost" Header="View/_Edit Cost" Click="mniEditCost_Click" IsEnabled="False"></MenuItem>
                    <MenuItem x:Name="mniDeleteCost" Header="_Delete Cost" Click="mniDeleteCost_Click" IsEnabled="False"></MenuItem>
                </ContextMenu>
            </ListView.ContextMenu>
        </ctrls:SortableListView>
        <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" Margin="0,0,0,5">
            <TextBlock Grid.Row="3" Grid.Column="0">Total Buy Price:</TextBlock>
            <rdf:NumericTextBox Grid.Row="3" Grid.Column="1" IsEnabled="False" MinWidth="50" Margin="0,0,10,0">
                <rdf:NumericTextBox.Text>
                    <Binding Path="Booking.AdditionalCostsBuyPriceConvertedTotal" UpdateSourceTrigger="PropertyChanged"
Converter="{StaticResource currencyStringConverter}" ConverterParameter="#0.00" Mode="OneWay">
                    </Binding>
                </rdf:NumericTextBox.Text>
            </rdf:NumericTextBox>
            <TextBlock Grid.Row="3" Grid.Column="0">Total Sell Price:</TextBlock>
            <rdf:NumericTextBox Grid.Row="3" Grid.Column="1" IsEnabled="False" MinWidth="50" Margin="0,0,10,0">
                <rdf:NumericTextBox.Text>
                    <Binding Path="Booking.AdditionalCostsSellPriceConvertedTotal" UpdateSourceTrigger="PropertyChanged"
Converter="{StaticResource currencyStringConverter}" ConverterParameter="#0.00" Mode="OneWay">
                    </Binding>
                </rdf:NumericTextBox.Text>
            </rdf:NumericTextBox>
            <TextBlock Grid.Row="3" Grid.Column="0">Total Margin:</TextBlock>
            <rdf:NumericTextBox Grid.Row="3" Grid.Column="1" IsEnabled="False" MinWidth="50" Margin="0,0,10,0">
                <Binding Path="Booking.AdditionalCostsMarginConvertedTotal" UpdateSourceTrigger="PropertyChanged"
Converter="{StaticResource currencyStringConverter}" ConverterParameter="#0.00" Mode="OneWay">
                </Binding>
            </rdf:NumericTextBox>
            <TextBlock Grid.Column="1" Grid.Row="3" HorizontalAlignment="Right" Text="{Binding Path=Booking.SellPriceCurrency.Name, Mode=OneWay}" Margin="0,0,0,0"/>
        </StackPanel>
    </DockPanel>

谢谢,M

1 个答案:

答案 0 :(得分:0)

您的DockPanel包含:

  1. StackPanel
  2. a SortableListView
  3. 另一个StackPanel
  4. 1&amp; 2都停靠在顶部; 3停靠在底部。这意味着你中间没有任何东西,即。介于2和2之间3.重新排列元素的顺序以放置SortableListView第三个,并删除其DockPanel.Dock属性,以便占用剩余空间。

    换句话说,而不是你现在拥有的:

    <DockPanel>
        <StackPanel DockPanel.Dock="Top" ... >
        <ctrls:SortableListView DockPanel.Dock="Top" ... >
        <StackPanel DockPanel.Dock="Bottom" ... >
    </DockPanel>
    

    将其更改为:

    <DockPanel>
        <StackPanel DockPanel.Dock="Top" ... >
        <StackPanel DockPanel.Dock="Bottom" ... >
        <ctrls:SortableListView ... >
    </DockPanel>