我有一个WPF应用程序,其DataGrid和ListView共享相同的ObservableCollection ItemsSource。当DataGrid的CanUserAddRows属性为True时,它会导致ListView显示DataGrid用于添加新行的额外项目。
如何从DataGrid中获取额外的行以便不在ListView中显示?
我尝试在ListView的DataTemplate上使用触发器并检查项ID是否为空或0
`<ListView.ItemTemplate>
<DataTemplate>
<Label Margin="-2,0,0,0" Name="CategoryLabel" >
<TextBlock TextWrapping="Wrap" Text="{Binding categoryName}" Height="46"></TextBlock>
</Label>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding categoryId}" Value="0" > <!-- also tried Value="" -->
<Setter TargetName="CategoryLabel" Property="Visibility" Value="Hidden" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListView.ItemTemplate>`
答案 0 :(得分:1)
我刚刚发布了使用数据模板选择器更改模板的问题的答案
Change View with its ViewModel based on a ViewModel Property
可能只是因为我最近看过这个,但我想知道是否可以在这里使用相同的技术。
有一个模板用于类别具有值的位置,然后是另一个没有类别的值的空白模板。重要的是你在代码而不是XAML中进行测试,因此更容易检查。
答案 1 :(得分:1)
您无需修改ViewModel或代码即可解决问题。您可以在不明确定义任何类型的CollectionView的情况下完成。只需在ViewView ItemsSource集合的默认视图的NewItemPlaceholder项上触发一个(或唯一)DataTrigger添加到视图的XAML中。使用此触发器将UIElement.Visibility附加属性设置为“隐藏”。将它放在ItemContainerStyle样式触发器中。像这样:
<ListView
ItemsSource="{Binding ...}"
>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
...
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding}"
Value="{x:Static CollectionView.NewItemPlaceholder}">
<Setter Property="UIElement.Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="..." Value="{Binding ...}" />
...
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Label Margin="..." Name="...">
<TextBlock TextWrapping="Wrap"
Text="{Binding ...}" />
</Label>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>