2013-10-11 7 views
12

पर आधारित डेटा मुझे डेटाग्रिड में पैरामीटर और मानों के आधार पर डेटाग्रिड में पंक्तियों को छिपाने की जरूरत है। मुझे ऐसा कुछ करने का अनुमान लगाया गया;डैटग्रिड में डब्ल्यूपीएफ छिपाने की स्थिति

foreach (System.Data.DataRowView dr in myDataGrid.ItemsSource) 
{ 
    //Logic to determine if Row should be hidden 
    if (hideRow == "Yes") 
    { 
     //Hide row code 
    } 
} 

मैं समझ नहीं सकता कि पंक्ति को वास्तविक रूप से कैसे छिपाना है। कृपया ध्यान दें कि मैं डेटाग्रिड या आइटम स्रोत पंक्ति पंक्ति को हटाना नहीं चाहता हूं।

उत्तर

17

तो hideRow तालिका के एक क्षेत्र नहीं है (अर्थात नहीं DataGridRow में एक स्तंभ):

<DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding AnyProp, Converter={StaticResource hiddenConverter}}" Value="True"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

और अपने तर्क के साथ कनवर्टर का एहसास। बाध्य चर के प्रकार, उपरोक्त AnyProp, नीचे आपका प्रॉपर्टी टाइप होगा। AnyProp पंक्ति में किसी भी कॉलम हो सकता है।

[ValueConversion(typeof(yourPropType), typeof(bool))] 
public class hiddenConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (hideRow == "Yes") 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 


} 

'मान' AnyProp हो जाएगा, और यह इस तरह के 'hideRow' के रूप में, तर्क या नहीं, पंक्ति को दिखाने के लिए, या उस फैसले पर कुछ अन्य विषय आधारित हो सकता है निर्धारित करता है कि में इस्तेमाल किया जा सकता उदाहरण।

+1

मैं यह नहीं समझ सकता कि 'अगर छुपाएं यह तालिका का क्षेत्र नहीं है:' मतलब है। क्षमा करें, लेकिन अंग्रेजी मेरी मूल भाषा नहीं है और यह गलत व्याकरण के कारण मेरे लिए कोई समझ नहीं लेती है। नीचे दिए गए कोड पर – WoIIe

+0

'hideRow' एक नकली चर है। वास्तव में यह एक कस्टम तर्क है जिसे आपको लागू करने की आवश्यकता है। – progpow

+0

धन्यवाद, यह मुझे सही रास्ते पर मिला। @Wolle मैंने इसे सही करने की कोशिश की है, उम्मीद है कि जिस तरह से इसका इरादा था। मुझे एक IValueConverter.ConvertBack विधि जोड़नी पड़ी, क्योंकि यह अन्यथा संकलित नहीं करेगा - मुझे नहीं पता कि उसके आसपास कुछ रास्ता है या नहीं? यह अंत में मेरे लिए कोई फर्क नहीं पड़ता, लेकिन मुझे आश्चर्य हुआ कि क्या केवल एक फ़ील्ड की बजाय पूरी बाउंड पंक्ति वस्तु को पार करना संभव था। – njplumridge

8

आप codebehind में यह कर के बजाय Datagrid.ItemContainerStyle में यह कर सकते हैं ...

<DataGrid> 
     <DataGrid.ItemContainerStyle> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
         <DataTrigger Binding="{Binding PROPERTY}" Value="VALUE"> 
           <Setter Property="Visibility" Value="Collapsed"/> 
2

अपने व्यापार डेटा के साथ डेटा ग्रिड से जोड़ने के लिए एक CollectionViewSource का प्रयोग करें। CollectionViewSource प्रत्येक पंक्ति के लिए फ़िल्टर ईवेंट को सक्रिय करता है। इस घटना में, आपका कोड तय कर सकता है कि पंक्ति प्रदर्शित की जानी चाहिए या नहीं।

अपने XAML में जोड़ें:

<Window.Resources> 
    <CollectionViewSource x:Key="sampleViewSource" CollectionViewType="ListCollectionView"/> 
</Window.Resources> 

<DataGrid DataContext="{StaticResource sampleViewSource}" ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 

अपने कोड के लिए निम्न जोड़ें फ़ाइल के पीछे:

stocksViewSource = ((System.Windows.Data.CollectionViewSource)(FindResource("sampleViewSource"))); 
sampleViewSource.Filter += sampleViewSource_Filter; 

फिल्टर eventhandler बनाएँ। आप e.Item से पंक्ति डेटा प्राप्त कर सकते हैं। ई सेट करके। स्वीकृत अगर आप पंक्ति को प्रदर्शित किया जाना चाहिए तो आप नियंत्रित कर सकते हैं।

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