我怎样才能控制wrapanel,这样如果我删除了一个项目,顺序就不会改变

问题描述 投票:0回答:1

listview
中,我使用
Wrappanel
作为
ItemsPanelTemplate

<ListView ItemsSource="{Binding TodoItemViewModels}"
    ScrollViewer.VerticalScrollBarVisibility="Disabled"
    Drop="Card_Drop"
    AllowDrop="True"
    DragLeave="Card_DragLeave"
    IsEnabled="{Binding Disable, ElementName=root}"
    Background="Green">

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Margin="0" Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>


    <!-- Displaying Cards in CardCollection View -->
    <ListView.ItemTemplate>
        <DataTemplate>            
            <Border BorderThickness="2"
                BorderBrush="BlanchedAlmond" 
                Opacity="1"
                Background="BlanchedAlmond"
                Width="25" Height="30"
                MouseMove="Card_MouseMove"
                CornerRadius="5"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch">
                
                <TextBlock Text="{Binding Cardstr}"
                    HorizontalAlignment="Stretch"
                    VerticalAlignment="Stretch"
                    Foreground="{Binding Cardclr}"
                    Background="BlanchedAlmond" />
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>

</ListView>

before removing an item

我怎样才能修复

Listview
,所以如果我删除一个项目,它的位置将会有一个空槽,而不是像下面的图片那样重新排列列表: after removing an item

我尝试了

Wrapanel
Gridview
都无法正常工作。 我不想在网格中逐个单元插入,因为这会使程序变得复杂

c# wpf listview wpf-controls
1个回答
0
投票

您不应移除卡,而应将其替换为代表空插槽的另一个对象。

例如,您可以向包含

IsEmpty
Cardstr
属性的类添加
Cardclr
属性,然后使用
DataTemplateSelector
基于此属性选择适当的模板:

public class CustomTemplateSelector : DataTemplateSelector
{
    public DataTemplate CardTemplate { get; set; }
    public DataTemplate EmptyTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var obj = item as YourClass;
        if (obj != null && obj.IsEmpty && EmptyTemplate != null)
            return EmptyTemplate;

        return CardTemplate;
    }
}

XAML:

<ListView ItemsSource="{Binding TodoItemViewModels}"
    ScrollViewer.VerticalScrollBarVisibility="Disabled"
    Drop="Card_Drop"
    AllowDrop="True"
    DragLeave="Card_DragLeave"
    IsEnabled="{Binding Disable, ElementName=root}"
    Background="Green">

    <ListView.Resources>
        <DataTemplate x:Key="cardTemplate">
            <Border BorderThickness="2"
                 BorderBrush="BlanchedAlmond" 
                 Opacity="1"
                 Background="BlanchedAlmond"
                 Width="25" Height="30"
                 MouseMove="Card_MouseMove"
                 CornerRadius="5"
                 HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch">

                <TextBlock Text="{Binding Cardstr}"
                     HorizontalAlignment="Stretch"
                     VerticalAlignment="Stretch"
                     Foreground="{Binding Cardclr}"
                     Background="BlanchedAlmond" />
            </Border>
        </DataTemplate>
        <DataTemplate x:Key="emptyTemplate">
            <Border>
                <TextBlock>empty...</TextBlock>
            </Border>
        </DataTemplate>
    </ListView.Resources>

    <ListView.ItemTemplateSelector>
        <local:CustomTemplateSelector
            CardTemplate="{StaticResource cardTemplate}"
            EmptyTemplate="{StaticResource emptyTemplate}"/>
    </ListView.ItemTemplateSelector>

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Margin="0" Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>

</ListView>
© www.soinside.com 2019 - 2024. All rights reserved.