c# - 在最后一个 listviewitem 之后放置一个按钮

标签 c# wpf xaml listview

我的 ListView 绑定(bind)到一个 ObservableCollection,有没有办法在最后一个 listviewitem 之后放置一个按钮?我所做的是在 DataTemplate 中定义按钮,如下所示:

    <DataTemplate x:Key="TestDataTemplate">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>            
            <TextBlock x:Name="SeletedFilterText" Text="{Binding}" />
            <Button Command="{Binding DataContext.TestCommand,ElementName=TestListView}"                    
                Content="Test"                    
                Visibility="{Binding Converter={StaticResource testConverter}}"
                Grid.Column="1"/>        
    </Grid>      
</DataTemplate>

在我的 ViewModel 中,我定义了一个字符串变量来存储最后一项。每次我将 Collection 的最后一个设置为 LastItem 变量时,ItemSource(一个 Observable)可以添加或删除项目。在转换器中,将绑定(bind)的内容与LastItem进行比较,如果值为true,则显示Button,如果为false,则隐藏。但转换器永远不会被触发。谁能帮忙?

最佳答案

我建议不要在 ViewModel 中使用备份字段来跟踪集合中的 lastItem。

您可以只使用 Converter 来做到这一点,如果传递的 ListViewItemListView 中的最后一项,它将返回 true 或 false还是不

如果您想在底层 ObservableCollection 添加/删除项目时调用转换器,我建议将 Count 属性传递给转换器,以便转换器每当从集合中添加/删除项目时都会触发。


转换器代码:

public class IsLastItemInContainerConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter,
                          CultureInfo culture)
    {
        DependencyObject item = (DependencyObject)values[0];
        ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);

        if (ic != null)
        {
            return ic.ItemContainerGenerator.IndexFromContainer(item)
                      == ic.Items.Count - 1;
        }
        else
            return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes,
                                object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML:

<Button Content="Test">
   <Button.Style>
     <Style TargetType="Button">
       <Setter Property="Visibility" Value="Collapsed"/>
       <Style.Triggers>
         <DataTrigger Value="True">
           <DataTrigger.Binding>
             <MultiBinding
                  Converter="{StaticResource IsLastItemInContainerConverter}">
                <Binding Path="."
                         RelativeSource="{RelativeSource Mode=FindAncestor, 
                                           AncestorType=ListViewItem}"/>
                <Binding Path="DataContext.SourceCollection.Count"
                         RelativeSource="{RelativeSource Mode=FindAncestor, 
                                                    AncestorType=ListView}"/>
             </MultiBinding>
           </DataTrigger.Binding>
           <Setter Property="Visibility" Value="Visible"/>
         </DataTrigger>
       </Style.Triggers>
     </Style>
   </Button.Style>
</Button>

SourceCollection 替换为您在 dataTrigger 中的 ObservableCollection 名称

关于c# - 在最后一个 listviewitem 之后放置一个按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22299366/

相关文章:

c# - Windows Phone 禁用应用程序栏按钮

c# - 计算句子中单词数的控制台应用程序。 (C#)

c# - Task.Run() 如何传递其他线程拥有的对象?

c# - 如何使用 LINQ 选择未知子元素位置的子节点

c# - Binding Mode=TwoWay 仅适用于 "one"方式

.net - 强制 WPF 滚动条仅落在整数值上

c# - WPF 中的 ScrollViewer 问题

c# - 如何/在何处查找 WPF 控件的 Microsoft 默认样式

wpf - 如何更改 ContentPresenter 上的 FontFamily?

c# - 如何将 "click"处理程序添加到作为控件模板一部分的按钮?