我有一個ItemsControl在XAML中,我爲每個組顯示一個擴展器,所以我可以展開/摺疊該組。我想堅持IsExpanded
屬性的狀態(以及可能與組標題顯示有關的其他設置)。通常你只需要一個帶有屬性的類並綁定到它。但是,該組的數據上下文是CollectionViewGroup
。現在這個類沒什麼幫助,因爲它只給你Name屬性和組中的項目(如果你只是想要一個標題,並且可能會根據組中項目的數量或者它們顯示某種度量內容但不是如果你只是想存儲有關組頭標準UI狀態的自定義數據)。我想要做的是從這個類派生,並將其他屬性添加到我的派生類並綁定到它。但似乎沒有任何簡單的方法來做到這一點。所有團體一代的細節似乎都隱藏在內部課堂,這是非常令人沮喪的。有沒有人沿着自己實施ICollectionView
的路線走下去了(因此所有其他相關類也是如此)?這似乎是一個龐大的工作,複製ListCollectionView
中的所有內容,只是爲了能夠創建一個自定義的CollectionViewGroup
類並將其綁定到該類!謝謝。如何將自定義數據與CollectionViewGroup相關聯?
回答
一個簡單的方法就是將CollectionViewGroup包裝到另一個ViewModel類中,以提供額外所需的顯示屬性,如IsExpanded。我苦苦學習的一個教訓是不要彎曲xaml /視圖來匹配業務數據。而是彎曲/包裝或轉換業務數據以符合UI的要求。
一種方法是使用MultiBinding
來查找或計算自定義數據和綁定時間。
我使用組,顯示在標題項目特定值的總和的組在由DataGrid
,爲了當組項目改變我做了一個多值與自定義多值轉換器的結合來更新這總和,多值與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>
另外不要忘記宣佈你的轉換類我n您的XAML的資源部分:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:UserBalanceConverter x:Key="UserBalanceConverter"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
EtVoilà!它像一個魅力!
HTH
這是如何回答OP的問題?他問如何堅持IsExpanded的價值,而不是從他在問題中排除的項目中產生指標。 – Firo
我能夠解決正是這個問題使用了一種方法,就是有點類似塞德里克的建議(即結合IsExpanded
),但在一個看似更MVVM方式:
<ControlTemplate TargetType="GroupItem">
<TreeViewItem IsExpanded="{Binding Items[0].IsGroupExpanded, Mode=TwoWay}">
<TreeViewItem.Header>
<TextBlock Text="{Binding Name}" />
</TreeViewItem.Header>
<TreeViewItem.Items>
<ItemsPresenter />
</TreeViewItem.Items>
</TreeViewItem>
</ControlTemplate>
ItemViewModel.IsGroupExpanded
setter和getter重定向到Group.IsExpanded
。
請注意,Mode=TwoWay
必須指定,因爲IsExpanded
默認情況下似乎綁定OneWay
。
- 1. 將自定義數據與Outlook mailItem/inspector窗口相關聯
- 2. 如何將Storyboard UIViewController與我的自定義UIViewController類相關聯?
- 3. 如何將函數與Google Maps API中的自定義控件相關聯?
- 4. 如何顯示與自定義文檔關聯的元數據
- 5. 如何關聯的自定義元數據與SurveyMonkey調查?
- 6. 如何將數據與UITableView中的特定行相關聯
- 7. 自定義SOAP標頭如何與自定義WCF標頭相關聯?
- 8. 將自定義數據與擺動控件關聯?
- 9. 我可以將自定義元數據與ALAsset關聯嗎?
- 10. 你的自定義類如何與數據庫相關
- 11. 將自定義UICollectionViewController與子視圖相關聯
- 12. 如何將一些自定義數據與當前的HttpRequest關聯?
- 13. 如何以編程方式將uicontroller與自定義uiview相關聯
- 14. 如何將入站Twilio調用sid與自定義ID相關聯?
- 15. 如何定義數據庫關聯
- 16. 如何將自定義URL協議與ClickOnce應用關聯?
- 17. 如何將自定義小部件與SWT中的TreeItem關聯?
- 18. Qt - 如何將數據與QTableWidgetItem關聯?
- 19. 如何在另一個自定義字段類型上將分類與自定義字段類型相關聯?
- 20. 如何將Google地圖地理編碼器回撥響應與我的自定義數據相關聯?
- 21. 如何使用連接表將數據與對方相關聯?
- 22. 如何將數組鍵與特定的先前鍵相關聯?
- 23. Wordpress-獲取與自定義分類相關聯的自定義帖子類型
- 24. 將自定義uri方案與Java自帶應用程序相關聯的windows
- 25. Rails與自定義字段的關聯
- 26. 散景與自定義索引相關聯刷牙
- 27. Java - 將數據輸入與數據輸出相關聯?
- 28. 將自定義對象與特定用戶關聯
- 29. 如何將自我託管的內容與交易相關聯?
- 30. 自定義AuthorizeAttribute +自定義SiteMapProvider相關?
你能用一個例子來解釋你的觀點嗎? –