2012-11-05 64 views
6

我有一個ItemsControl在XAML中,我爲每個組顯示一個擴展器,所以我可以展開/摺疊該組。我想堅持IsExpanded屬性的狀態(以及可能與組標題顯示有關的其他設置)。通常你只需要一個帶有屬性的類並綁定到它。但是,該組的數據上下文是CollectionViewGroup。現在這個類沒什麼幫助,因爲它只給你Name屬性和組中的項目(如果你只是想要一個標題,並且可能會根據組中項目的數量或者它們顯示某種度量內容但不是如果你只是想存儲有關組頭標準UI狀態的自定義數據)。我想要做的是從這個類派生,並將其他屬性添加到我的派生類並綁定到它。但似乎沒有任何簡單的方法來做到這一點。所有團體一代的細節似乎都隱藏在內部課堂,這是非常令人沮喪的。有沒有人沿着自己實施ICollectionView的路線走下去了(因此所有其他相關類也是如此)?這似乎是一個龐大的工作,複製ListCollectionView中的所有內容,只是爲了能夠創建一個自定義的CollectionViewGroup類並將其綁定到該類!謝謝。如何將自定義數據與CollectionViewGroup相關聯?

回答

0

一個簡單的方法就是將CollectionViewGroup包裝到另一個ViewModel類中,以提供額外所需的顯示屬性,如IsExpanded。我苦苦學習的一個教訓是不要彎曲xaml /視圖來匹配業務數據。而是彎曲/包裝或轉換業務數據以符合UI的要求。

+3

你能用一個例子來解釋你的觀點嗎? –

1

一種方法是使用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

+0

這是如何回答OP的問題?他問如何堅持IsExpanded的價值,而不是從他在問題中排除的項目中產生指標。 – Firo

0

我能夠解決正是這個問題使用了一種方法,就是有點類似塞德里克的建議(即結合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

相關問題