C# 具有相同itemssource的Datagrid和Listview
我有一个带有DataGrid和ListView的WPF应用程序,它们共享相同的ObservableCollection ItemsSource。当DataGrid的CanUserAddRows属性为True时,它会导致ListView显示DataGrid用于添加新行的额外项 如何从DataGrid中获取额外的行,使其不显示在ListView中 我尝试在ListView的DataTemplate上使用触发器并检查items Id是空的还是0C# 具有相同itemssource的Datagrid和Listview,c#,wpf,listview,datagrid,C#,Wpf,Listview,Datagrid,我有一个带有DataGrid和ListView的WPF应用程序,它们共享相同的ObservableCollection ItemsSource。当DataGrid的CanUserAddRows属性为True时,它会导致ListView显示DataGrid用于添加新行的额外项 如何从DataGrid中获取额外的行,使其不显示在ListView中 我尝试在ListView的DataTemplate上使用触发器并检查items Id是空的还是0 `<ListView.ItemTemplate&g
`<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>`
`
`
我刚刚发布了一个关于使用数据模板选择器更改模板的问题的答案
可能只是因为我最近看过这个,但我想知道是否有可能在这里使用相同的技术
在类别有值的情况下使用一个模板,然后在没有类别的情况下使用另一个空白模板。重要的是,您可以使用代码而不是XAML进行测试,这样更易于检查。您可以在不修改ViewModel或代码的情况下解决问题。如果不明确定义任何类型的CollectionView,您都可以做得很好。只需向视图的XAML中添加一个(或唯一一个)DataTrigger,该数据触发器在ListView ItemsSource集合的默认视图的NewItemPlaceholder项上触发。使用此触发器将UIElement.Visibility attached属性设置为“Hidden”。将其放置在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>
...
...
只是一些指针:使用ListCollectionView.Filter
回调创建ListCollectionView(其源是您的ObservableCollection),并将其分配给ListBox.ItemsSource
属性。在过滤器回调中,然后检查DataGrid添加的占位符项…我建议使用第二个@elgonzo,这似乎是正确的方法。