具有相同itemssource的Datagrid和Listview

3
我有一个WPF应用程序,其中包含一个DataGrid和ListView,它们共享同一个ObservableCollection ItemsSource。当DataGrid的CanUserAddRows属性为True时,它会导致ListView显示DataGrid用于添加新行的额外项。
如何使ListView不显示DataGrid中的额外行?
我尝试在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>` 

3
一些建议:创建一个ListCollectionView(其源为您的ObservableCollection),并使用“ListCollectionView.Filter”回调进行赋值,然后将其分配给“ListBox.ItemsSource”属性。在筛选器回调中,检查由DataGrid添加的占位符项目... - user2819245
我赞同@elgonzo的看法,这似乎是正确的方法。 - Federico Berasategui
2个回答

1
您可以在不修改ViewModel或代码后台的情况下解决问题。您可以不需要显式定义任何CollectionView就能够很好地解决问题。只需在视图的XAML中添加一个(或仅一个)DataTrigger,该触发器会在ListView ItemsSource集合的默认视图中的NewItemPlaceholder项目上触发。将此触发器设置为将UIElement.Visibility附加属性设置为“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>

1

我刚刚发布了一个关于使用数据模板选择器更改模板的问题的答案。

基于ViewModel属性更改View和ViewModel

可能是因为我最近看过这个,但我想知道是否可以在这里使用相同的技术。

有一个模板用于分类有值的情况,另一个空白模板用于没有分类的值。重要的部分是你在代码中进行测试而不是XAML,所以更容易检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接