2010-01-27 19 views
9

के भीतर से वर्तमान आइटम को बाइंडिंग मैं एक WPF noob के बारे में कुछ कर रहा हूँ तो ;-) ले यह मुझ पर आसान कृपयाWPF - समूह हैडर शैली

मैं एक समूहीकृत डेटा ग्रिड (WPF टूलकिट संस्करण) बनाने के लिए कोशिश कर रहा हूँ। मैंने डेटा स्रोत, डेटाग्रिड स्वयं, आवश्यक संग्रह दृश्य संसाधन और समूह शीर्षलेख के लिए स्टाइल सफलतापूर्वक बनाया है (जो एक विस्तारक का उपयोग करता है)।

मैं 'Assign_To' नामक एक संपत्ति द्वारा समूह करना चाहता हूं और उसके पास प्रासंगिक मान (समूहीकृत आइटम जो मूल्य साझा करता है) शीर्षलेख में दिखाई देता है। हालांकि, मैं अपने Assign_To प्रॉपर्टी को वापस करने के लिए मौजूदा समूह/आइटम से कैसे जुड़ना है, इस बारे में काम नहीं कर सकता।

निकटतम मुझे मिला है (नीचे दिखाया गया है) समग्र संग्रह दृश्य संसाधन के लिए बाध्यकारी है, जो Assign_To के लिए एक निश्चित मान देता है। 'Assign_To' के लिए सही मान वापस करने के लिए वर्तमान आइटम/समूह से जुड़ने का उचित तरीका क्या होगा?

उम्मीद है कि कोई मदद कर सकता है। धन्यवाद!

एंडी टी

यहाँ स्रोत है ...

<Window DataContext="{Binding Source={StaticResource SampleDataSource}}" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    x:Class="DataGridTest.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" Height="480" mc:Ignorable="d"> 

    <Window.Resources> 
     <CollectionViewSource x:Key="CVS" Source="{Binding MyData}"> 
      <CollectionViewSource.GroupDescriptions> 
       <PropertyGroupDescription PropertyName="Assign_To"/> 
      </CollectionViewSource.GroupDescriptions> 
     </CollectionViewSource> 

     <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type GroupItem}"> 
         <Expander IsExpanded="True"> 
          <Expander.Header> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="Assign To: "/> 
            <TextBlock Text="{Binding Source={StaticResource CVS}, Path=Assign_To}"/> 
           </StackPanel>        
          </Expander.Header> 
          <ItemsPresenter/> 
         </Expander> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </Window.Resources> 


    <Grid x:Name="LayoutRoot"> 
     <dg:DataGrid 
     ItemsSource="{Binding Source={StaticResource CVS}}" 
     SelectionUnit="CellOrRowHeader" 
     CanUserAddRows="False" 
     CanUserDeleteRows="False" 
     CanUserResizeRows="False"> 
     <dg:DataGrid.GroupStyle> 
      <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}"> 
       <GroupStyle.Panel> 
        <ItemsPanelTemplate> 
         <dg:DataGridRowsPresenter/> 
        </ItemsPanelTemplate> 
       </GroupStyle.Panel> 
      </GroupStyle> 
     </dg:DataGrid.GroupStyle>   
     </dg:DataGrid> 
    </Grid> 
</Window> 

उत्तर

18

आपके उत्तर के लिए धन्यवाद। मैं वास्तव में इसकी सराहना करता हूं और यह देखने के लिए जांच करूँगा कि यह काम करता है या नहीं।

वैसे भी, जैसा कि यह निकलता है, कुछ पोकिंग और प्रोडिंग के बाद, मैंने केवल एक्सएएमएल का उपयोग करके इसे काम किया है। जो मैं खो रहा था वह यह तथ्य था कि प्रत्येक आइटम समूह शीर्षलेख समूहइटम और का डिफ़ॉल्ट डेटाकॉन्टेक्स्ट समूहइटमसंग्रह दृश्य समूह है। बदले में, संग्रह दृश्य समूह में आइटम संपत्ति है, जो संग्रह है और इसलिए मैं Assign_To संग्रह में पहले आइटम का मान प्राप्त कर सकता हूं और अपने हेडर टेक्स्ट में इसका उपयोग कर सकता हूं। इस तरह:

<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type GroupItem}"> 
         <Expander IsExpanded="True"> 
          <Expander.Header> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="Assign To: "/> 
            <TextBlock Text="{Binding Items[0].Assign_To}"/> 
           </StackPanel>  
          </Expander.Header> 
          <ItemsPresenter/> 
         </Expander> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
5

बाध्यकारी सेटिंग्स Assign_To संपत्ति के प्रकार पर निर्भर करते हैं। सबसे सरल सेटिंग्स जो शायद आप के लिए काम कर सकता था होगा:

<TextBlock Text="Assign To: "/> 
<TextBlock Text="{Binding Name}"/> 

कृपया, तो देखें कि नीचे एक उदाहरण आप के लिए काम करेगा; भी इस लिंक WPF Toolkit DataGrid Part IV: TemplateColumns and Row Grouping के लिए आप

कोड उपयोगी हो सकता है:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var dataProvider = (CollectionViewSource)FindResource("CVS"); 
     dataProvider.Source = Test.GetTests(); 
    } 
} 

public class Test 
{ 
    public string Assign_To { get; set; } 
    public string Test0 { get; set; } 
    public int  Test1 { get; set; } 

    public static List<Test> GetTests() 
    { 
     List<Test> tests = new List<Test>(); 

     tests.Add(new Test { Assign_To = "a", Test0 = "aaaa", Test1 = 1 }); 
     tests.Add(new Test { Assign_To = "a", Test0 = "bbbb", Test1 = 1 }); 
     tests.Add(new Test { Assign_To = "b", Test0 = "cccc", Test1 = 2 }); 

     return tests; 
    } 
} 

XAML:

<Window.Resources>  
    <CollectionViewSource x:Key="CVS" > 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="Assign_To"/> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 

    <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GroupItem}"> 
        <Expander IsExpanded="True"> 
         <Expander.Header> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="Assign To: "/> 
           <TextBlock Text="{Binding Name}"/> 
          </StackPanel> 
         </Expander.Header> 
         <ItemsPresenter /> 
        </Expander> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style>  
</Window.Resources> 

<Grid>   
    <DataGrid 
     ItemsSource="{Binding Source={StaticResource CVS}}"    
     HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended" 
     AutoGenerateColumns="False" 
     Name="dataGrid1">  
     <DataGrid.GroupStyle> 
      <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}"> 
       <GroupStyle.Panel> 
        <ItemsPanelTemplate> 
         <DataGridRowsPresenter/> 
        </ItemsPanelTemplate> 
       </GroupStyle.Panel> 
      </GroupStyle> 
     </DataGrid.GroupStyle>  
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Test0" Binding="{Binding Path=Test0}" /> 
      <DataGridTextColumn Header="Test1" Binding="{Binding Path=Test1}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
+0

सुंदर सब करना होगा कि में मौजूदा समूह द्वारा प्रदर्शित है यकीन है कि '' संग्रह में अंतर्निहित आइटम से कोई लेना देना नहीं कुछ भी – MickyD

संबंधित मुद्दे