2009-11-16 8 views
22

का उपयोग कर सेल के पृष्ठभूमि रंग को कैसे बदलूं, मैं WPF टूलकिट डाटाग्रिड का उपयोग कर रहा हूं, और मैं सामग्री की सामग्री के आधार पर एक सेल का पृष्ठभूमि रंग सेट करना चाहता हूं, पंक्ति नहीं सेल।मैं डब्ल्यूपीएफ टूलकिट डाटाग्रिड

सादगी के लिए, कहें कि कॉलम को फू कहा जाता है और मुझे लगता है कि जब फू 1 है, तब लाल रंग की नीली नीली हो, जब फू 2 हो, पीला जब फू 3 हो और हरा जब फू 3.

यदि मैं ऐसा कर सकता हूं, तो मुझे पूरा यकीन है कि मैं उन जटिल परिस्थितियों को हल कर सकता हूं जिनसे मुझे निपटने की आवश्यकता है।

उत्तर

33

आप शैलियों और DataTriggers के साथ ऐसा संबंध है। बस अपने डिफ़ॉल्ट पृष्ठभूमि संपत्ति के साथ अपने ElementStyle सेट इस मामले ग्रीन में, और अन्य मामलों के लिए DataTriggers जोड़ें:

<DataGridTextColumn Binding="{Binding WhateverIWantToDisplay}" > 
    <DataGridTextColumn.ElementStyle> 
    <Style TargetType="{x:Type TextBlock}"> 

     <Setter Property="Background" 
     Value="{Binding Foo, Converter={x:Static my:FooToColorConverter.Instance}}" /> 

    </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 
इस के साथ

:

<DataGridTextColumn Binding="{Binding WhateverIWantToDisplay}" > 
    <DataGridTextColumn.ElementStyle> 
    <Style TargetType="{x:Type TextBlock}"> 

     <Setter Property="Background" Value="Green" /> 

     <Style.Triggers> 
     <DataTrigger Binding="{Binding Foo}" Value="1"> 
      <Setter Property="Background" Value="Blue" /> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding Foo}" Value="2"> 
      <Setter Property="Background" Value="Red" /> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding Foo}" Value="2"> 
      <Setter Property="Background" Value="Yellow" /> 
     </DataTrigger> 

     </Style.Triggers> 
    </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

एक और दृष्टिकोण एक कनवर्टर के साथ एक बाध्यकारी उपयोग करने के लिए है कनवर्टर:

public class FooToColorConverter : IValueConverter 
{ 
    public static readonly IValueConverter Instance = new FooToColorConverter(); 
    public object Convert(object value, ... 
    { 
    int foo = (int)value; 
    return 
     foo==1 ? Brushes.Blue : 
     foo==2 ? Brushes.Red : 
     foo==3 ? Brushes.Yellow : 
     foo>3 ? Brushes.Green : 
     Brushes.Transparent; // For foo<1 
    } 
    public object ConvertBack(... 
    { 
    throw new NotImplementedException(); 
    } 
} 

ध्यान दें कि जवाब देने के serge_gubenko रूप में अच्छी तरह से काम करेगा दे दी है, लेकिन अपने फू संपत्ति के मूल्य ne केवल अगर ver परिवर्तन। ऐसा इसलिए है क्योंकि कलर प्रॉपर्टी गेटर केवल एक बार बुलाया जाएगा। रंग को केवल पढ़ने-योग्य निर्भरता प्रॉपर्टी में बदलकर और फू को असाइन किए जाने पर अपडेट करके उसका समाधान सुधार किया जा सकता है, लेकिन आम तौर पर आपके डेटा मॉडल में रंग जैसी यूआई-विशिष्ट जानकारी रखने का एक बुरा विचार है, इसलिए इसकी अनुशंसा नहीं की जाती है।

+0

आपको बहुत बहुत धन्यवाद। मुझे डब्ल्यूपीएफ को काम करने में इतनी निराशा होती है क्योंकि यह त्रुटियों को छिपाने के लिए होती है और जब आपके पास कोड सही नहीं होता है तो बस कुछ भी नहीं करते हैं। लेकिन जब यह काम करता है, और जब आप जानते हैं कि आप क्या कर रहे हैं, तो इसकी बिजली तेज और उपयोग में आसान है। मैं ईमानदारी से कहूंगा कि डब्ल्यूपीएफ में मैंने उपयोग की जाने वाली किसी भी तकनीक का सबसे तेज़ सीखने की वक्र है। वैसे भी, धन्यवाद। मैं कनवर्टर के साथ गया क्योंकि यह मुझे सबसे बड़ी लचीलापन देता है। –

+0

सुंदर .. !!! मेरी तरफ से +1 .. !! – samar

6

कॉलम के लिए एलिमेंट स्टाइल को परिभाषित करने के तरीकों में से एक तरीका है और फिर टेक्स्टग्राउंड पृष्ठभूमि को डेटाग्रिड पंक्ति के पीछे डेटा तत्व की रंग संपत्ति में बाध्य करना है। यहाँ एक उदाहरण है:

DataGridTextColumn XAML:

<DataGridTextColumn Width="SizeToCells" 
         MinWidth="150" 
         Binding="{Binding Name}"> 

    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="TextBlock.Background" Value="{Binding Color}" /> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

डेटा आइटम घोषणा:

public class TestItem 
{ 
    public TestItem(int foo) 
    { 
     Foo = foo; 
    } 

    public int Foo { get; set; } 
    public Brush Color 
    { 
     get 
     { 
      Color color = Colors.Green; 
      switch (Foo) 
      { 
       case 1: color = Colors.Red; break; 
       case 2: color = Colors.Yellow; break; 
      } 
      return new SolidColorBrush(color); 
     } 
    } 
} 

आशा है कि यह मदद करता है,

+0

यह अगर फू का मूल्य कभी के बाद ग्रिड प्रदर्शित किया जाता है बदल जाता है काम नहीं करेगा काम करेंगे: सेल रंग अपडेट नहीं होगा। अधिक जानकारी के लिए मेरा जवाब देखें। –

+0

और न तो अगर फू बदलता है (उदाहरण के लिए, डेटा बाध्यकारी के कारण) ग्रिड प्रदर्शित करते समय। – greenoldman

+0

वैसे इसकी पुरानी है, लेकिन आपको इसे ठीक करने की ज़रूरत है, रंग परिवर्तन के यूआई को सूचित करने के लिए, क्लास टेस्टइटेम द्वारा बदलें IotifyProperty को लागू करना है। – Tafari

1

serge_gubenko अच्छी तरह से करता है, तो अपने मद INotifyPropertyChanged से विरासत में तो जब अपनी संपत्ति ("yourproperty") NotifyPropertyChanged करने के लिए कॉल बदल जाएगा