2010-03-02 21 views
5

मैं पंक्ति के लिए नेस्टेड डेटाग्रिड प्रदर्शित करने के लिए RowDetailsTemplate का उपयोग कर रहा हूं। जब मैं इस नेस्टेड डाटाग्रिड को दिखाने के लिए एक पंक्ति का चयन करता हूं तो डेटाग्रिड ऊंचाई में फैलता है। लेकिन जब पंक्ति को अचयनित किया जाता है तो यह इसकी ऊंचाई को कम नहीं करता है।RowDetailsTemplate को अचयनित करने के बाद डेटाग्रिड ऊंचाई का आकार बदलें

  1. क्या पंक्ति विवरण गिरने के बाद डेटाग्रिड को अपनी मूल ऊंचाई में बदलने का कोई तरीका है?

  2. क्या यह घोषणात्मक रूप से करना संभव है?

उत्तर

1

इस समस्या के लिए एक काम मिला; ग्रिड ट्रिगर के लिए चयन में परिवर्तन ग्रिड आइटमों का ताज़ा ट्रिगर होता है, इससे ग्रिड खुद को फिर से निकालने का कारण बनता है।

private void dgVehicles_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     DataGrid dg = sender as DataGrid; 
     if (dg != null) 
     { 
      dg.Items.Refresh(); 
     } 
     e.Handled = true; 
    } 

यह मेरे लिए काम करता है। आशा करता हूँ की ये काम करेगा।

+0

मेरे लिए काम किया, thx – Artiom

-1

सेट StackPanel में DataGrid.VerticalAlignment = System.Windows.VerticalAlignment.Top

+2

यह समस्या को हल करने के लिए कुछ भी नहीं करता है। – Harv

2

प्लेस विस्तार और इस इस व्यवहार के साथ ग्रिड:

public class DataGridDetailResizeBehavior : Behavior<FrameworkElement> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     this.AssociatedObject.SizeChanged += new SizeChangedEventHandler(Element_SizeChanged); 
    } 

    protected override void OnDetaching() 
    { 
     this.AssociatedObject.SizeChanged -= new SizeChangedEventHandler(Element_SizeChanged); 
     base.OnDetaching(); 
    } 

    private void Element_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     //Find DataGridDetailsPresenter 
     DataGridDetailsPresenter rowDetailPresenter = null; 
     var element = this.AssociatedObject; 
     while (element != null) 
     { 
      rowDetailPresenter = element as DataGridDetailsPresenter; 
      if (rowDetailPresenter != null) 
      { 
       break; 
      } 

      element = (FrameworkElement)VisualTreeHelper.GetParent(element); 
     } 

     if (rowDetailPresenter != null) 
     { 
      var row = UIHelper.GetParentOf<DataGridRow>(this.AssociatedObject); 
      if (row != null && row.DetailsVisibility == Visibility.Visible) 
      { 
       //Set height 
       rowDetailPresenter.ContentHeight = this.AssociatedObject.ActualHeight; 
      } 
     } 
    } 
} 

और XAML इस तरह दिखता है:

<sdk:DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <StackPanel> 
      <Grid> 
       <sdk:DataGrid... 

       <i:Interaction.Behaviors> 
        <myinteractivity:DataGridDetailResizeBehavior /> 
       </i:Interaction.Behaviors> 
      </Grid> 
     </StackPanel> 
    </DataTemplate> 
</sdk:DataGrid.RowDetailsTemplate> 

यह मेरे लिए काम किया।

+0

व्यवहार वर्ग क्या है? – Artiom

0

नोट: यदि आपको स्वतंत्र स्क्रॉलिंग के लिए अपने नेस्टेड DataGrid की आवश्यकता है तो यह आपके लिए काम नहीं करेगा। ओपी के प्रश्न में उस विवरण का उल्लेख नहीं किया गया था।

मुझे एहसास है कि यह एक पुराना धागा है, लेकिन मैंने अपनी समस्या को हल करने के तरीके की तलाश करते हुए उस पर ठोकर खाई और सोचा कि दूसरों को जो कुछ मिल रहा है उसे देखना पसंद हो सकता है। मैंने होलाजान द्वारा सुझाए गए व्यवहार दृष्टिकोण की कोशिश नहीं की क्योंकि मैं अपनी राय में अपने मुद्दे के लिए एक क्लीनर समाधान की तलाश में था। उस ने कहा कि मुझे DataGrid पर घोषणात्मक रूप से ScrollViewer.CanContentScroll="False" का उपयोग करने के लिए एक एमएसडीएन मंच पर एक पोस्ट मिली।

पोस्ट मैं कहाँ पाया मेरी समाधान पर है: http://social.msdn.microsoft.com/Forums/is/wpf/thread/a0e7aea8-e9ad-441f-a775-1178aab75fb0

जवाब उल्लेखनीय जवाब में निहित है और है:।
"मैं पूरी तरह से असंबद्ध सेटिंग सेट करके समस्या सुलझा ली है लग रहा था

मेरे बच्चे के ग्रिड में मेरे पास ScrollViewer.CanContentScrollTrue पर सेट किया गया था। एक बार जब मैं इसे सभी चाइल्ड Grid में गलत पर सेट करता हूं तो यह जादुई रूप से काम करता था। अब जब मैं अपनी पंक्ति विवरण को संकुचित करता हूं तो यह उचित पंक्ति का आकार बदलता है। "