我的 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
来做到这一点,如果传递的 ListViewItem
是 ListView
中的最后一项,它将返回 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/