2008-09-18 16 views
28

मैं निम्नलिखित XAML है:WPF Datatrigger फायरिंग नहीं जब उम्मीद

<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Margin="0,0,5,0"/> 
<TextBlock Text="items selected"> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1"> 
        <Setter Property="TextBlock.Text" Value="item selected"></Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

पहले पाठ खंड खुशी से, SelectedItems.Count के साथ बदलता 0,1,2 दिखा, आदि दूसरे खंड पर datatrigger कभी नहीं लगता है पाठ को बदलने के लिए आग लगाना।

कोई विचार?

+1

आप जानते हैं, मुझे नहीं पता कि यह डाउनवॉट क्यों प्राप्त करता है - यह एक वैध सवाल है। यदि आप कम करते हैं, तो कम से कम एक टिप्पणी छोड़ दें क्यों। –

+1

यह विचित्र है, – viggity

+0

अपना रास्ता अपवर्त भेजना यह अस्पष्ट शीर्षक हो सकता है, लेकिन यह डेटा ट्रिगर के साथ एक आम समस्या है और यह एक अच्छा उदाहरण है, +1 –

उत्तर

13

डेटा ट्रिगर फायरिंग कर रहा है लेकिन आपके दूसरे टेक्स्टब्लॉक के लिए टेक्स्ट फ़ील्ड को "आइटम चुने गए" के रूप में हार्ड-कोड किया गया है, इसलिए यह बदलने में सक्षम नहीं होगा। इसे फायरिंग देखने के लिए, आप टेक्स्ट = "आइटम चुने गए" को हटा सकते हैं।

आपकी समस्या बजाय एक ValueConverter का उपयोग कर DataTrigger लिए एक अच्छे उम्मीदवार है। टेक्स्ट को सेट करने के लिए इसे प्राप्त करने के लिए वैल्यू कनवर्टर बनाने और उसका उपयोग करने का तरीका यहां दिया गया है।

xmlns:local="clr-namespace:ValueConverterExample" 

अपने संसाधनों के लिए कनवर्टर जोड़ें::

public class CountToSelectedTextConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((int)value == 1) 
      return "item selected"; 
     else 
      return "items selected"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

अपने विधानसभा कनवर्टर स्थित है के लिए नाम स्थान संदर्भ जोड़ें:

इस ValueConverter बनाएं

<Window.Resources> <local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/> </Window.Resources> 

बदलें अपने दूसरे TextBlock रहे हैं:

<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/> 
+0

आप सही काम कर रहे पाठ को हटा रहे हैं। मैं बस पाठ के लिए चुने गए आइटम (ओं) के साथ जा रहा हूं क्योंकि मुझे इसके लिए एक संपूर्ण कनवर्टर बनाना पसंद नहीं है। हालांकि, मैं इसे एक स्वीकृत उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह काम करेगा। –

+1

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

28

वैकल्पिक रूप से, आप इस के साथ अपने XAML की जगह सकता है:

<TextBlock Margin="0,0,5,0" Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}"/> 
<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Text" Value="items selected"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1"> 
        <Setter Property="Text" Value="item selected"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

कन्वर्टर्स समस्याओं बाध्यकारी लेकिन विशेष कन्वर्टर्स का एक बहुत होने का एक बहुत हल कर सकते हैं बहुत गन्दा हो जाता है।

+0

धन्यवाद, आपके उत्तर ने मेरी समस्या तय की है! –

+0

धन्यवाद, एक बहुत बेवकूफ प्रतिबंध/डिजाइन दोष/माइक्रो $ की लगाई गई जलन के लिए एक आसान समाधान। – Xtr

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