MVVM在DataGrid上的CompositeCollection绑定
本文关键字:CompositeCollection 绑定 上的 DataGrid MVVM | 更新日期: 2023-09-27 18:22:14
我有一个名为cmpc
的CompositeCollection
,它包含一些ObservableCollection。
我将CompositeCollection中的数据沙到DataGrid中,结果是它的DataGridTextColumn,如下所示:
<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>
确切地说,我只想看到其中的行。Remarque不是NULL值,它是由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>
绑定在差异DataGridTextColumn
上的数据来自相同的CompositeCollection(cmpc
),但来自不同的Observable Collection,如前所述。
例如,.Flag来自ObservableCollection ActiviteCollection
,.PMRKTOTM来自ResultatCollection
,如.LibelléTOTApres和.LibellèTOTAvant,.PDiscipline来自D98DetailsCollection
等。
它工作得很好,我可以将数据放入数据网格,但我有一个问题。
数据打印为"ObservableCollection after Observable Collection"我的意思是数据没有交叉。它首先打印来自ResultatCollection
的数据,并让与另一个ObservableCollection绑定的DataGridTextColumn
s为空,然后打印来自另一个ObservableCollection的数据(例如.D98 DetailsCollection),并让其他DataGridTextColumn
s与另一ObservableCollections绑定为空,等等。
我不明白为什么我会在ObservableCollection之后获得Observable Collection,但这不是我的目标。我想获取交叉数据。PMRQTOTM是每个ObservableCollection的"primaryKey",因此对于同一个PMRQTOTM,我希望在同一行中看到D98DetailsCollection、ActiviteCollection、ResultatCollection等的数据。
我希望我的请求足够精确,不要犹豫,请我添加一些代码,也许像我是如何制作CompositeCollection、ObservableCollections或其他任何东西的。
提前感谢您的帮助。
问候。
我总是像躲避瘟疫一样躲避CompositeCollection
。正如你所发现的,它们使用起来很尴尬,而且真的,完全没有必要。我发现把我所有不同类型的对象放在一个集合中要好得多,因为它们可以按任何顺序排列。你可以用多种不同的方法来做到这一点,不同的方法在某些场景中更好,而其他方法更适合其他场景。
我们可以做的一件事是定义一个基类,该基类包含我们想要在集合中显示的所有数据类型的公共属性。然后,我们的集合可以是该基类的类型,我们可以向其中添加任何派生类型。第二个类似的选项是定义一个公开公共属性的接口,在相关类中实现它,然后生成该接口类型的集合。
最后一种选择是简单地使用类型为object
的集合。现在我们可以按任何顺序向其中添加任何类型。