我有一个名为CompositeCollection
的{{1}},其中包含一些ObservableCollection。
我将数据从CompositeCollection传递到DataGrid,结果是它的DataGridTextColumn,如下所示:
cmpc
我确切地说我只想查看.Remarque不是NULL值的行,它由<DataGrid x:Name="DonneesBrutes" IsReadOnly="True" ItemsSource="{Binding Path=.cmpc}" Margin="0,65,0,0" AutoGenerateColumns="False" EnableRowVirtualization="True" RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding .Remarque}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn x:Name="PrisEnCompte" Binding="{Binding Path=.Flag}" Header="Pris En Compte"></DataGridTextColumn>
<DataGridTextColumn x:Name="PMRQ" Width="*" Binding="{Binding Path=.PMRQTOTM}" Header="PMID"></DataGridTextColumn>
<DataGridTextColumn x:Name="LibellePMRQ" Width="*" Binding="{Binding Path=.LibelléTOTApres}" Header="Libellé PMRQ"></DataGridTextColumn>
<DataGridTextColumn x:Name="Ligne" Width="40" Binding="{Binding Path=.Remarque}" Header="Ligne" IsReadOnly="True"></DataGridTextColumn>
<DataGridTextColumn x:Name="OTM" Width="*" Binding="{Binding Path=.TOTMPMRQ}" Header="OTM"></DataGridTextColumn>
<DataGridTextColumn x:Name="TOTM" Width="50" Binding="{Binding Path=.SiModifie}" Header="TOTM"></DataGridTextColumn>
<DataGridTextColumn x:Name="LibelleTOTM" Width="*" Binding="{Binding Path=.LibelléTOTApres}" Header="Libellé OTM"></DataGridTextColumn>
<DataGridTextColumn x:Name="GA" Width="70" Binding="{Binding Path=.Groupe_D_alerte}" Header="GA"></DataGridTextColumn>
<DataGridTextColumn x:Name="Discipline" Width="*" Binding="{Binding Path=.NomTable}" Header="Discipline"></DataGridTextColumn>
<DataGridTextColumn x:Name="DisciplineSubstituee" Width="120" Binding="{Binding Path=.NomChamp}" Header="Discipline Substituée"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
完成:
DataGrid.RowStyle
在不同<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding .Remarque}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
上绑定的数据来自同一个CompositeCollection(DataGridTextColumn
),但来自不同的Observable Collection,如前所述。
例如,.Flag来自ObservableCollection cmpc
,. PMRQTOTM来自ActiviteCollection
,如.LibelléTOTApres和.LibelléTOTAvant,.Discipline来自ResultatCollection
等。
效果很好,我可以将数据输入数据网格,但我有一个问题。
数据被打印“ObservableCollection之后的ObservableCollection”我的意思是数据没有交叉。它首先从D98DetailsCollection
打印数据,然后将ResultatCollection
与另一个ObservableCollection绑定为空,然后打印另一个ObservableCollection的数据(例如.D98DetailsCollection)并让其他DataGridTextColumn
绑定另一个ObservableCollection为空,等等。
我不明白为什么我会在ObservableCollection之后得到ObservableCollection,但这不是我的目标。我想获得交叉数据。 .PMRQTOTM是每个ObservableCollection的“primaryKey”,因此对于相同的.PMRQTOTM,我想在同一行中看到来自D98DetailsCollection,ActiviteCollection,ResultatCollection等的数据。
我希望我的要求非常准确,请不要犹豫,让我添加一些代码,也许就像我制作CompositeCollection,我的ObservableCollections或其他任何代码一样。
提前感谢您的帮助。
问候。
答案 0 :(得分:1)
我总是避免像瘟疫一样CompositeCollection
。它们很难用,因为你已经发现并且真的,完全没必要。我发现将所有不同类型的对象放入单个集合中要好得多,因为它们可以按任何顺序排列。您可以通过多种不同方式执行此操作,在某些情况下,不同的方法更好,而其他方案更适合其他方案。
我们可以做的一件事是定义一个基类,它包含我们想要在集合中显示的所有数据类型的公共属性。然后我们的集合可以是该基类的类型,我们可以将任何派生类型添加到其中。第二个类似的选项是定义一个公开公共属性的接口,在相关的类中实现它,然后收集该接口的类型。
最后一个选项是简单地使用object
类型的集合。现在我们可以按任意顺序添加任何类型。