Datagrid和Listview具有相同的itemssource

时间:2014-07-24 21:00:07

标签: c# wpf listview datagrid

我有一个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>` 

2 个答案:

答案 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>