gpt4 book ai didi

wpf - 如何将自定义数据与 CollectionViewGroup 关联?

转载 作者:行者123 更新时间:2023-12-04 15:59:53 33 4
gpt4 key购买 nike

我在 XAML 中有一个 ItemsControl,我在其中为每个组显示一个扩展器,以便我可以展开/折叠该组。我想保持 IsExpanded 的状态属性(以及可能与组标题显示相关的其他设置)。通常你只有一个带有属性的类并绑定(bind)到它。但是,该组的数据上下文是 CollectionViewGroup .现在这个类不是很有帮助,因为它只为您提供 Name 属性和组中的项目(如果您只想要一个标题并且可能根据组中的项目数或它们的项目数显示某种指标,这很好内容,但如果您只想存储有关组头 UI 状态的自定义数据,则不需要)。我想做的是从这个类派生并将其他属性添加到我的派生类并绑定(bind)到它。但似乎没有任何简单的方法可以做到这一点。组生成的所有细节似乎都隐藏在内部类中,这非常令人沮丧。有没有人沿着实现路线走 ICollectionView他们自己(因此也可能是所有其他相关的类)?复制 ListCollectionView 中的所有内容似乎是一项艰巨的工作只是为了能够创建自定义CollectionViewGroup上课并绑定(bind)到那个!谢谢。

最佳答案

一种方法是使用 MultiBinding查找或计算自定义数据和绑定(bind)时间。

我做了一个DataGrid组在标题中显示组中项目特定值的总和,为了在组项目更改时更新此总和,我使用自定义多值转换器进行了多值绑定(bind),多值绑定(bind)与 ItemCount属性允许在组项更改时得到通知,然后更新总和并显示新闻总和值。

这是多值转换器类的代码:

Public Class UserBalanceConverter
Implements IMultiValueConverter

Private Function GetSubTotal(ByVal obj As CollectionViewGroup) As String

Dim total As Decimal
For Each objItem As Object In obj.Items
If TypeOf objItem Is Account Then
Dim a As Account = DirectCast(objItem, Account)
Dim rate As Decimal = 1
rate = 1 / ExchangeRatesInfo.GetExchangeRate(a.currencyCode.ToString)

total += a.Balance * rate
Else
total += GetSubTotal(objItem)
End If
Next

Return total.ToString("C")
End Function

Public Function Convert(ByVal value() As Object,
ByVal targetType As System.Type,
ByVal parameter As Object,
ByVal culture As System.Globalization.CultureInfo) _
As Object Implements System.Windows.Data.IMultiValueConverter.Convert

Dim cvg As CollectionViewGroup = CType(value(1), CollectionViewGroup)

Return GetSubTotal(cvg)

End Function


Public Function ConvertBack(ByVal value As Object,
ByVal targetType() As System.Type,
ByVal parameter As Object,
ByVal culture As System.Globalization.CultureInfo) _
As Object() Implements System.Windows.Data.IMultiValueConverter.ConvertBack

Throw New NotImplementedException

End Function

End Class

然后在 XAML 中,您使用用于 GroupItem 的样式的多值转换器:
  <Style TargetType ="{x:Type GroupItem}" x:Key="UserGroupHeaderStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="exp" IsExpanded="False">
<Expander.Header>
<StackPanel >
<TextBlock Text="{Binding Name}" />
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding ItemCount}">
<TextBlock Text=" "/>
<TextBlock Text="items" />
<TextBlock Text=" "/>
<TextBlock Text="Balance: " />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource UserBalanceConverter}">
<Binding Path="ItemCount"/>
<Binding />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

完成将样式应用于您的 DataGrid :
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource UserGroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>

另外不要忘记在 XAML 的资源部分声明您的转换类:
  <ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:UserBalanceConverter x:Key="UserBalanceConverter"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

瞧!它就像一个魅力!

高温高压

关于wpf - 如何将自定义数据与 CollectionViewGroup 关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235112/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com