2014-07-24 51 views
3

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

如何从DataGrid中获取额外的行以便不在ListView中显示?

我尝试使用上ListView控件的DataTemplate中的触发器和检查,如果项目编号为空或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添加的占位符项... – elgonzo

+0

我第二@elgonzo似乎是正确的方法。 –

回答

1

我刚刚发布了一个答案,使用一个数据模板选择

更改模板的问题

Change View with its ViewModel based on a ViewModel Property

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

对于类别具有值的位置有一个模板,对于没有类别的值则使用另一个空白模板。重要的是你在代码而不是XAML中进行测试,因此更容易检查。

1

您可以解决您的问题,而无需对您的ViewModel或代码进行任何修改。没有明确定义任何类型的CollectionView,你都可以做得很好。只需在ViewView的Items集合的默认视图的NewItemPlaceholder项上再添加一个(或者只有)DataTrigger即可。有此触发器将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> 
相关问题