Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有相同itemssource的Datagrid和Listview_C#_Wpf_Listview_Datagrid - Fatal编程技术网

C# 具有相同itemssource的Datagrid和Listview

C# 具有相同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

我有一个带有DataGrid和ListView的WPF应用程序,它们共享相同的ObservableCollection ItemsSource。当DataGrid的CanUserAddRows属性为True时,它会导致ListView显示DataGrid用于添加新行的额外项

如何从DataGrid中获取额外的行,使其不显示在ListView中

我尝试在ListView的DataTemplate上使用触发器并检查items 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>` 
`
` 

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

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


在类别有值的情况下使用一个模板,然后在没有类别的情况下使用另一个空白模板。重要的是,您可以使用代码而不是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,这似乎是正确的方法。