2011-06-28 8 views
7

मैं सिल्वरलाइट करने के लिए अपने WPF कौशल में से कुछ को परिवर्तित करने का प्रयास कर रहा हूँ पर फायरिंग नहीं, और परीक्षण मिनी एप्लिकेशन मैं पर काम कर रहा है में एक से थोड़ा अजीब समस्या में पड़ गए हैं। डब्ल्यूपीएफ में, मुझे बाध्य डेटा के गुणों के आधार पर नियंत्रण गुण स्थापित करने के लिए एक शैली के भीतर डेटाट्रिगर्स का उपयोग करने के लिए उपयोग किया गया। मुझे लगता है कि आप सिल्वरलाइट में कुछ इस तरह करने की अनुमति मिश्रण से संबंधित कुछ विधानसभाओं की खोज की है, और मैं कुछ इस तरह है, जिसमें मुझे मिल गया है निम्नलिखित नामस्थान घोषित के साथ आया था:सिल्वरलाइट DataTrigger लोड

xmlns:ia="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
xmlns:iv="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 


<DataTemplate x:Key="testItemTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBox Text="{Binding Name, Mode=TwoWay}" x:Name="thing"/>     
      <iv:Interaction.Triggers> 
       <ia:DataTrigger Binding="{Binding Name}" Value="ReddenMe" Comparison="Equal"> 
        <ia:ChangePropertyAction TargetName="thing" PropertyName="Foreground" Value="Red"> 
        </ia:ChangePropertyAction> 
       </ia:DataTrigger> 
      </iv:Interaction.Triggers> 
     </StackPanel> 
    </DataTemplate> 

इस उदाहरण में, मैं INOTifyProperty को लागू करने वाली डेटा ऑब्जेक्ट प्राप्त हुई है और नाम संपत्ति के लिए सामान्य रूप से PropertyChanged ईवेंट को बढ़ाया गया है। अगर मैं पाठ बॉक्स के मान बदलने और ध्यान खोना मैं अपेक्षित व्यवहार मिलता है, लेकिन पाठ बॉक्स के प्रारंभिक मूल्य ReddenMe (जो इस काल्पनिक उदाहरण के लिए मैं ट्रिगर के रूप में उपयोग कर रहा हूँ पाठ के लिए लाल होने के लिए) के लिए सेट है, पाठ लाल नहीं जाता है। क्या कोई जानता है कि यहाँ क्या हो रहा है? डब्ल्यूपीएफ में डेटा ट्रिगर के लिए, किसी भी डेटा के लिए तुरंत ट्रिगर निकाल दिया जाएगा।

मुझे लगता है कि मैं एक कनवर्टर यहाँ इस्तेमाल कर सकते हैं, लेकिन मैं स्थितियों में, जहां मैं चलाता का उपयोग करना चाहते हैं, उसके बारे में सोच सकते हैं, और मुझे आश्चर्य है कि क्या मैं इस काम करने के लिए कर सकता है अगर।

+0

हाय ... अपने दुविधा परीक्षण किया है और एक ही समस्या मिला है। दुर्भाग्य से यह क्या होता है जब, आप के रूप में, हम सिल्वरलाइट और नीचे करने के लिए WPF से नीचे जा रहा है:। ओ (यदि एक समाधान मौजूद है जानते हैं, लेकिन मैं एक कनवर्टर बनाया काम करने के लिए और यह प्रारंभिक मान के साथ काम किया – NestorArturo

+0

धन्यवाद कि NestorArturo के लिए: हाँ, के बाद मैं इस पोस्ट में, मैं एक कनवर्टर के साथ एक ही पूर्ण करने का प्रयास है, और यह है कि मैं क्या करने के बाद था ऐसा करने के लिए लग रहा था यह सुनने के लिए किसी भी WPF/Silverlight गुरु अलग की खूबियों के बारे में क्या सोचते हैं दिलचस्प होगा। कन्वर्टर्स बनाम विशुद्ध रूप से XAML-आधारित दृष्टिकोण। दिखा/नियंत्रण छुपा जैसी चीजों के लिए, मैं हमेशा की तरह, DataTrigger दृष्टिकोण मिल गया है थोड़ा अधिक पारदर्शी होने के लिए हालांकि मुझे लगता है कि आप लोगों का तर्क हो सकता है कि एक कनवर्टर होने से, आप अव्यवस्था कम अंत अंत में मार्कअप – andrewmcc

+0

आप इस व्यवहार को देख सकते हैं क्योंकि DataTrigger PropertyChangeTrigger से लिया गया है और आपके मामले में नाम संपत्ति प्रारंभ में नहीं बदल रही है। या यह एक बग हो सकता है। आप DataTri में देखने के लिए .NET परावर्तक का उपयोग कर सकते हैं। पुष्टि करने के लिए गेज कार्यान्वयन। मैंने पहले डेटाट्रिगर्स का उपयोग किया है, लेकिन इस तथ्य के कारण मैं इस मुद्दे में शायद नहीं चला हूं कि मैं विजुअल स्टेट मैनेजर का उपयोग करता हूं और डिफ़ॉल्ट स्थिति से शुरू करता हूं। वांछित व्यवहार को मजबूर करने का एक तरीका यह है कि XAML लोड होने के बाद नाम मान सेट करना है। – Denis

उत्तर

11

यहां a solution है जो मैंने टॉम पेप्लो के ब्लॉग पर पाया: डेटा ट्रिगर से प्राप्त होता है, और ट्रिगर को उस स्थिति का मूल्यांकन करते हैं जब उसके संबंधित तत्व को लोड किया जाता है।

यहाँ कैसे आप इसे कोड कर सकते हैं:

public class DataTriggerEvaluateOnLoad : Microsoft.Expression.Interactivity.Core.DataTrigger 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     var element = AssociatedObject as FrameworkElement; 
     if (element != null) 
     { 
      element.Loaded += OnElementLoaded; 
     } 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     var element = AssociatedObject as FrameworkElement; 
     if (element != null) 
     { 
      element.Loaded -= OnElementLoaded; 
     } 
    } 

    private void OnElementLoaded(object sender, RoutedEventArgs e) 
    { 
     EvaluateBindingChange(null); 
    } 
} 
+0

धन्यवाद! मैं आज इस के साथ संघर्ष कर रहा था। – Aligned

+0

यह बहुत उपयोगी है ... – Craig

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