2009-08-20 10 views
17

मेरे पास एक सूची बॉक्स है जो LogMessages के पर्यवेक्षण चयन के लिए बाध्य है।डब्ल्यूपीएफ, एक्सएएमएल: ListBox आइटम्स ऑब्जेक्ट की सूची पर बाइंडिंग का उपयोग करके ListBoxItem को कैसे स्टाइल करें?

public ObservableCollection<LogMessage> LogMessages { get; set; } 
public LogMessageData() 
{ 
    this.LogMessages = new ObservableCollection<LogMessage>(); 
} 

प्रत्येक संदेश दो पैरामीटर है:

public class LogMessage 
{ 
    public string Msg { get; set; } 
    public int Severity { get; set; } 
    //code cut... 
} 

ListBox उन वस्तुओं से भरा जा रहा है, और मैं रंग-कोड (बदल एक पृष्ठभूमि रंग की ListBoxItem) सूची की जरूरत है एक LogMessage आइटम के गंभीरता पैरामीटर के आधार पर।

<UserControl.Resources> 
    <AlternationConverter x:Key="BackgroundSeverityConverter"> 
     <SolidColorBrush>Green</SolidColorBrush> 
     <SolidColorBrush>Yellow</SolidColorBrush> 
     <SolidColorBrush>Red</SolidColorBrush> 
    </AlternationConverter> 
    <Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Background" 
       Value="{Binding RelativeSource={RelativeSource TemplatedParent}, 
       Path=Severity, 
       Converter={StaticResource BackgroundSeverityConverter}}"/> 
    </Style> 
    <DataTemplate x:Key="LogDataTemplate"> 
     <TextBlock x:Name="logItemTextBlock" Width="Auto" Height="Auto" 
     Text="{Binding Msg}"/> 
    </DataTemplate> 
</UserControl.Resources> 

और एक वास्तविक ListBox:

यहाँ है कि मैं क्या लॉग दिखा उपयोगकर्ता नियंत्रण की XAML में अब है

<ListBox IsSynchronizedWithCurrentItem="True" 
    ItemTemplate="{DynamicResource LogDataTemplate}" 
    ItemsSource="{Binding LogFacility.LogMessages}" 
    x:Name="logListBox" Grid.Row="1" 
    ItemContainerStyle="{StaticResource BindingAlternation}" /> 

AlternationConverter प्रयोग किया जाता है क्योंकि संदेश की गंभीरता पैरामीटर प्रकार की है Int (0..3), और हम आसानी से उस शैली का उपयोग कर शैलियों के बीच स्विच कर सकते हैं।

अवधारणा स्पष्ट है, लेकिन अब तक यह मेरे लिए काम नहीं करती है। ListBoxItem का पृष्ठभूमि रंग नहीं बदला था।

+0

मेरा हल यह है कि इसे {रिलेटिवसोर्स टेम्पलेटेड पेरेंट} के साथ करना है। एप्लिकेशन को डीबग करते समय आपको आउटपुट विंडो में कोई बाध्यकारी त्रुटियां मिलती हैं? –

+0

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

उत्तर

30

उपयोग ItemContainerStyle:

<ListBox ItemsSource="{Binding LogMessages}"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Background" Value="{Binding Severity, Converter={StaticResource YourBackgroundConverter}}"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
+0

धन्यवाद, यह मेरे लिए एक आकर्षण की तरह काम किया। –

4

तरह बोजन टिप्पणी की, यह RelativeSource जो वहाँ नहीं होना चाहिए है। {बाइंडिंग पथ = गंभीरता, कनवर्टर = {स्टेटिक रिसोर्स पृष्ठभूमिसेवरिटी कनवर्टर}} का उपयोग करें जब आप अपने डेटा ऑब्जेक्ट पर बाध्यकारी हों। RelativeSource.TemplatedParent ListBoxItem को बाध्य करने के लिए है।

साथ ही, मेरा एक पालतू झुंझलाहट के बारे में कुछ है, तो आप, ट्रिगर का उपयोग कर विचार कर सकते हैं उदाहरण के लिए:

<Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Severity}" Value="1"> 
      <Setter Property="Background" Value="Green"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Severity}" Value="2"> 
      <Setter Property="Background" Value="Yellow"/> 
     </DataTrigger> 
     <!-- etc.. --> 
    </Style.Triggers> 
<Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 

लेकिन वह सिर्फ एक निजी पसंद है .... आप क्या ठीक वहाँ काम करना चाहिए अगर आप ठीक है बाइंडिंग।

+0

मैंने केंट के समाधान के साथ इस मुद्दे को ठीक कर दिया है, लेकिन मैं भी आपकी कोशिश करूंगा। यह निश्चित रूप से कुछ बाहरी परिस्थितियों में उपयोगी हो सकता है। AlternationConverter का उपयोग करने का उद्देश्य यह था कि यह लॉगमैसेज में हमारे पास पूर्णांक डेटा को आसानी से व्याख्या करता है। आपका अपमान अधिक सामान्य है, इसलिए यह अधिक स्थितियों में लागू होगा। धन्यवाद! –

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