【问题标题】:CompositeCollection binding on a DataGrid by MVVMMVVM 在 DataGrid 上的 CompositeCollection 绑定
【发布时间】:2014-09-18 07:47:47
【问题描述】:

我有一个名为 cmpcCompositeCollection,其中包含一些 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来自ObservableCollectionActiviteCollection,.PMRQTOTM来自ResultatCollection,如.LibelléTOTApres和.LibelléTOTAvant,.Discipline来自D98DetailsCollection等。

效果很好,我可以将数据放入数据网格,但我有一个问题。

数据打印“ObservableCollection after ObservableCollection”我的意思是数据没有交叉。它首先打印来自ResultatCollection 的数据,然后让DataGridTextColumns 与另一个 ObservableCollection 绑定为空,然后打印来自另一个 ObservableCollection 的数据(例如.D98DetailsCollection)并让其他DataGridTextColumns 与另一个 ObservableCollection 绑定为空,等等.

我不明白为什么我会在 ObservableCollection 之后得到 ObservableCollection,但这不是我的目标。我想获得交叉数据。 .PMRQTOTM 是每个 ObservableCollection 的“primaryKey”,所以对于同一个 .PMRQTOTM,我想在同一行中查看来自 D98DetailsCollection、ActiviteCollection、ResultatCollection 等的数据。

我希望我的要求足够精确,不要犹豫,让我添加一些代码,比如我如何制作 CompositeCollection、ObservableCollections 或其他任何东西。

提前感谢您的帮助。

您好。

【问题讨论】:

  • 这是复合集合的常见行为,您可以尝试排序。你可能想看看stackoverflow.com/questions/2155395/…
  • 我检查一下,谢谢你的链接
  • 哇,听起来很复杂。我看到 IBindingList 可以让我得到我想要的东西,我会尝试使用这个属性。

标签: c# wpf mvvm data-binding datagrid


【解决方案1】:

我总是像瘟疫一样避免CompositeCollections。正如您所发现的那样,它们使用起来很尴尬,而且真的,完全没有必要。我发现将所有不同类型的对象放在一个集合中要好得多,因为它们可以按任何顺序排列。您可以通过多种不同的方式做到这一点,不同的方法在某些场景中效果更好,而另一些则更适合其他场景。

我们可以做的一件事是定义一个基类,其中包含我们想要在集合中显示的所有数据类型的公共属性。然后我们的集合可以是该基类的类型,我们可以将任何派生类型添加到其中。第二种类似的选择是定义一个公开公共属性的接口,在相关类中实现它,然后将该接口的类型集合起来。

最后的选择是简单地使用object 类型的集合。现在我们可以以任何顺序添加任何类型。

【讨论】:

  • 所以...如果我明白你的意思,我必须创建一个包含我需要的每个属性的类,以便为我想要获取的每个表创建一个 Big ObservableCollection(D675、D98Details、Activite、Resultat等)然后一旦这个类完成创建这个大 ObservableCollection(我不知道可以将几个表发送到 ObservableCollection?)然后只调用大 ObservableCollection 到 DataGrid,对吗?
  • 也许您有一些包含示例、代码或教程的链接来帮助我将您的解决方案应用于我的案例?
  • 不,但这真的不难。如果您不知道那是什么,只需搜索“接口”或“扩展类”。没有什么可以解释的了......我们只是在谈论将项目添加到集合中。
  • 谢谢大家。我想我已经足够完成我现在的目标了。
猜你喜欢
  • 2015-08-06
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2017-02-28
  • 2016-04-11
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多