2010-11-04 7 views
9

मेरे पास 3 डेटाग्रिड्स हैं जो समान डेटा प्रकार साझा करते हैं। मैं कॉलम को एक बार बाध्यकारी कॉन्फ़िगर करना चाहता हूं और 3 डेटाग्रिड्स संसाधन साझा करना चाहता हूं।क्या मैं डेटाग्रिड टेबल के बीच DataGrid.Columns साझा कर सकता हूं

उदा।

 <DataGrid Grid.Row="1" x:Name="primaryDG" ItemsSource="{Binding Path=dgSource AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/> 
      <DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/> 
      <DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/> 
      <DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

वहाँ एक DataTemplate या ControlTemplate कॉलम प्राप्त करने के लिए प्रत्येक डेटा ग्रिड के लिए ItemsSource स्थापित करने के लिए तो उपयोग करने के लिए एक रास्ता है?

+1

समान प्रश्न, उपयोगी जवाब: यहाँ एक EnhancedDataGrid के लिए कोड है http://stackoverflow.com/प्रश्न/5716123/wpf-datagrid-कॉलम-इन-स्टाइल-या-संसाधन – surfen

उत्तर

4

हाँ ... दो तरीके। एक तो आप बस DataGrid है कि इस तरह कॉलम सेट के लिए एक शैली में जोड़ सकते हैं ...

<Style x:Key="MyColumnDefsStyle" x:Shared="True" TargetType="DataGrid"> 
    <Setter Property="Columns"> 
     <Setter.Value> 
      <DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/> 
      <DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/> 
      <DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/> 
      <DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/> 
     </Setter.Value> 
    </Setter> 
</Style> 

<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo1}" /> 
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo2}" /> 
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo3}" /> 

यही काम करता है लेकिन एक समस्या अगर आप इसे एक से अधिक ग्रिड कि खुद को पहले से ही एक शैली का उपयोग किया जा सकता है के लिए आवेदन कर रहे हैं प्रतिनिधित्व करता है।

उस स्थिति में, दूसरा, अधिक लचीला तरीका बेहतर काम करता है। हालांकि, ObservableCollection<DataGridColumn> का प्रतिनिधित्व करने के लिए XAML- अनुकूल कक्षाएं बनाने की आवश्यकता है (हालांकि आपने तकनीकी रूप से केवल कॉलम कहा है, मैं खुद को पूरा करना चाहता हूं इसलिए मैं पंक्तियों के लिए भी एक करूंगा) फिर उन्हें उस स्थान पर जोड़ें जहां आप XAML में संदर्भित कर सकते हैं नामस्थान। (मैं मेरा xmlns:dge 'DataGridEnhancements' के लिए कहते हैं) फिर आप इस तरह उपयोग:

कोड में somwhere (मैं चाहता हूँ कि यह पहुंच एप्लिकेशन चौड़ा) ...

public class DataGridRowsCollection : ObservableCollection<DataGridRow>{} 
public class DataGridColumnsCollection : ObservableCollection<DataGridColumn>{} 
तब संसाधनों में

...

<dge:DataGridColumnsCollection x:Key="MyColumnDefs" x:Shared="True"> 
    <DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/> 
    <DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/> 
    <DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/> 
    <DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/> 
</dge:DataGridColumnsCollection> 

और अंत में XAML में ...

<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo1}" /> 
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo2}" /> 
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo3}" /> 

HTH,

मार्क

संपादित करें: जब से तुम DataGrid.Columns गुण सेट नहीं कर सकते हैं, तो आप करने की जरूरत है बढ़ाने अपने DataGridView (टिप्पणी में उल्लेख किया)।

public class EnhancedDataGrid : DataGrid 
    { 
     //the dependency property for 'setting' our columns 
     public static DependencyProperty SetColumnsProperty = DependencyProperty.Register(
      "SetColumns", 
      typeof (ObservableCollection<DataGridColumn>), 
      typeof (EnhancedDataGrid), 
      new FrameworkPropertyMetadata 
      { 
       DefaultValue = new ObservableCollection<DataGridColumn>(), 
       PropertyChangedCallback = EnhancedDataGrid.SetColumnsChanged, 
       AffectsRender = true, 
       AffectsMeasure = true, 
       AffectsParentMeasure = true, 
       IsAnimationProhibited = true, 
       DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, 
      }); 

     //callback to reset the columns when our dependency property changes 
     private static void SetColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var datagrid = (DataGrid) d; 

      datagrid.Columns.Clear(); 
      foreach (var column in (ObservableCollection<DataGridColumn>)e.NewValue) 
      { 
       datagrid.Columns.Add(column); 
      } 
     } 

     //The dependency property wrapper (so that you can consume it inside your xaml) 
     public ObservableCollection<DataGridColumn> SetColumns 
     { 
      get { return (ObservableCollection<DataGridColumn>) this.GetValue(EnhancedDataGrid.SetColumnsProperty); } 
      set { this.SetValue(EnhancedDataGrid.SetColumnsProperty, value); } 
     } 
    } 

अब आप SetColumns साथ कॉलम सेट कर सकते हैं अपने CustomControl में बनाया संपत्ति निर्भरता:

<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo1}" /> 
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo2}" /> 
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo3}" /> 
+1

क्या यह वास्तव में काम करता है? कॉलम संपत्ति में कोई सेटटर नहीं है: http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.columns.aspx – surfen

+2

ओउप्स! मुझे लगता है कि आप सही हैं। हमारा कोड काम करता था क्योंकि हमने एन्हांस्डडेटाग्रिड नामक एक कस्टम उप-वर्ग का उपयोग किया था जो इसे संभाला था। इसमें सेटर जोड़ा गया, लेकिन वास्तव में केवल बच्चों पर चले गए। उदाहरण के लिए मैंने अपने सबक्लास से डेटाग्रिड में कक्षा का नाम बदल दिया है। इसे कॉल करने के लिए धन्यवाद। ऐसा करने का सबसे आसान तरीका एक दूसरी संग्रह संपत्ति जोड़ना है, और आंतरिक रूप से अपनी सामग्री को बांधना है। ग्रिड के अंदर इस कोड से केवल मामूली परिवर्तन। – MarqueIV

+0

धन्यवाद अच्छा समाधान। क्या आप मुझे दिखा सकते हैं कि मेरे व्यूमोडेल पर कुछ संपत्ति के आधार पर ग्रिड "स्टाइल" कैसे सेट करें। मेरे पास एक ही डेटा –

1

आप डेटा ग्रिड को लपेटने और डेटा को पास करने के लिए केवल कस्टम नियंत्रण बना सकते हैं। नियंत्रण डेटा को ग्रिड पर सेट करेगा।

+0

यह केवल तभी काम करता है जब संपूर्ण ग्रिड सभी पुनरावृत्तियों के बीच समान हो, जो मामला हो या न हो। इसके अलावा, यह उन्हें नियंत्रण टेम्पलेट्स या अन्य शैलियों के साथ स्टाइल करने में सक्षम होने के साथ-साथ आपने इसे UserControl में लपेट लिया है। @Queso ने विशेष रूप से केवल कॉलम के बारे में पूछा है, इसलिए मैंने उपर्युक्त समाधान का सुझाव दिया है जो केवल उस लक्ष्य को लक्षित करता है और कहीं भी आप किसी भी ग्रिड का उपयोग कर रहे हैं, जिसमें उपयोगकर्ता नियंत्रण शामिल है। – MarqueIV

0

इस उत्तर MarquelV के समाधान पर आधारित है यहाँ एक EnhancedDataGrid के लिए कोड है। अपने उत्तर में (और टिप्पणियों में) उन्होंने EnhancedDataGrid नामक एक कस्टम कंट्रोल का उल्लेख किया, जहां वह DataGrid.Columns संपत्ति पर तर्क प्रदान करता है।

public class EnhancedDataGrid : DataGrid 
    { 
     //the dependency property for 'setting' our columns 
     public static DependencyProperty SetColumnsProperty = DependencyProperty.Register(
      "SetColumns", 
      typeof (ObservableCollection<DataGridColumn>), 
      typeof (EnhancedDataGrid), 
      new FrameworkPropertyMetadata 
      { 
       DefaultValue = new ObservableCollection<DataGridColumn>(), 
       PropertyChangedCallback = EnhancedDataGrid.SetColumnsChanged, 
       AffectsRender = true, 
       AffectsMeasure = true, 
       AffectsParentMeasure = true, 
       IsAnimationProhibited = true, 
       DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, 
      }); 

     //callback to reset the columns when our dependency property changes 
     private static void SetColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var datagrid = (DataGrid) d; 

      datagrid.Columns.Clear(); 
      foreach (var column in (ObservableCollection<DataGridColumn>)e.NewValue) 
      { 
       datagrid.Columns.Add(column); 
      } 
     } 

     //The dependency property wrapper (so that you can consume it inside your xaml) 
     public ObservableCollection<DataGridColumn> SetColumns 
     { 
      get { return (ObservableCollection<DataGridColumn>) this.GetValue(EnhancedDataGrid.SetColumnsProperty); } 
      set { this.SetValue(EnhancedDataGrid.SetColumnsProperty, value); } 
     } 
    } 

अब आप SetColumns साथ कॉलम सेट कर सकते हैं अपने CustomControl में बनाया संपत्ति निर्भरता:

<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo1}" /> 
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo2}" /> 
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo3}" /> 
संबंधित मुद्दे

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