2011-06-01 14 views
19

पर ध्यान दिए बिना बदलती है, तो मैं डेटाग्रिड में सेल पर एक एनीमेशन निष्पादित करने की कोशिश कर रहा हूं, जब डेटाग्रिड सेल का मान बदलता है।wpf - आग डेटाैट्रिगर जब संपत्ति नए मान

डेटाग्रिड स्वयं सादे पुराने सीएलआर वस्तुओं के एक पर्यवेक्षण चयन के लिए बाध्य है। इस मामले में कहें कि ऑब्जेक्ट 'पर्सनल' ऑब्जेक्ट्स 'फर्स्टनाम', 'लास्टनाम' और 'एज' के गुणों के साथ हैं। 'पर्सन' क्लास INotifyPropertyChanged इंटरफ़ेस लागू करता है और प्रत्येक प्रॉपर्टी पर इसके सेटटर में बदलकर प्रॉपर्टी पर उचित कॉल होता है।

यह सब ठीक है। datagrid परिभाषा में मैं इस प्रकार प्रत्येक कोशिका ड्राइंग के लिए मेरे DataTemplate निर्धारित किया है और एक datatrigger भी संलग्न ...:

<DataGridTemplateColumn Header="FirstName"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Border Name="templateBorder"> 
       <TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName}" /> 
      </Border> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding Path=FirstName}" Value="Richard"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard AutoReverse="True"> 
           <DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

जब मेरे ObservableCollection में एक वस्तु अद्यतन किया जाता है (मैं FirstName मूल्य बदल) datagrid है ठीक अद्यतन किया गया। उपर्युक्त उदाहरण के अनुसार, अगर मैंने फर्स्टनाम का मान 'रिचर्ड' में बदल दिया है तो एनीमेशन को भी ठीक से निष्पादित किया जाता है।

मेरी समस्या यह है कि मुझे अपना एनीमेशन चलाने की आवश्यकता है चाहे पहले नाम का नया मूल्य क्या है। मैंने वेब को क्रॉल किया है लेकिन कुछ दूर तक केवल ज्ञात मान के विरुद्ध ट्रिगर को फायर करने के उदाहरण मिलते हैं। फायर ट्रिगर जब फर्स्टनाम 'रिचर्ड' है जैसा कि मैंने अपने उदाहरण में प्रदर्शित किया है।

मेरा सवाल यह है कि मैं अद्यतन संपत्ति के मूल्य के बावजूद डेटाैट्रिगर को कैसे फायर करूं? तो मूल रूप से जब डेटाटाइड में दी गई पंक्ति के लिए फर्स्टनाम संपत्ति को अद्यतन किया जाता है तो मैं डेटाैट्रिगर को कैसे आग लगा सकता हूं।

बहुत धन्यवाद।

+0

आप दृश्य राज्य प्रबंधक का उपयोग करने का प्रयास क्यों नहीं करते ... इस पोस्ट को देखें। http://stackoverflow.com/questions/15258199/blend-trigger-vs-wpf-trigger – stromms

उत्तर

38

इस प्रश्न के जवाबों से प्राप्त पॉइंटर्स के लिए धन्यवाद मुझे पता चला कि उत्तर एक EventTrigger और TargetUpdated RoutedEvent का उपयोग करना था।

<DataTemplate> 
    <Border Name="templateBorder"> 
     <TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName, NotifyOnTargetUpdated=True}" /> 
    </Border> 
    <DataTemplate.Triggers> 
     <EventTrigger RoutedEvent="Binding.TargetUpdated"> 
      <BeginStoryboard> 
       <Storyboard AutoReverse="True"> 
        <DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

EventTrigger के अलावा, केवल एक अन्य बात यह है कि आवश्यक था स्थापित करने के लिए 'NotifyOnTargetUpdated = सच' जब की स्थापना TextBlock के लिए बाध्यकारी था।

धन्यवाद।

+4

+1 - अच्छा काम। मैं कुछ नया भी सीखता हूं :) – Gishu

+0

यह करने का यह तरीका है और यह काम करता है। मेरे पास एकमात्र मुद्दा यह है कि EventTriggers एंटर और बाहर निकलने के कार्यों का समर्थन नहीं करते हैं। तो आप जो कुछ भी कर सकते हैं वह किसी भी एनीमेशन को रिवर्स करने के लिए ऑटोविवर सक्षम बनाता है। –

+0

यदि आप "उपयोगकर्ता नियंत्रण" का उपयोग कर रहे हैं और सही पृष्ठ पर फिट करने के लिए पृष्ठभूमि में ViewModels का आदान-प्रदान कर रहे हैं, तो इस विधि के साथ कोई समस्या प्रतीत होती है। –

1

ऐसा लगता है कि आपको डेटा ट्रिगर के बजाय EventTrigger "जब कोई ईवेंट होता है" की आवश्यकता होती है।

यह स्वयं की कोशिश नहीं की गई .. लेकिन आपकी कस्टम इवेंट को बढ़ाने के लिए संभव होना चाहिए FirstNameChanged और इसके जवाब में ट्रिगर-क्रियाएं निष्पादित की जानी चाहिए।

+0

सही दिशा में मुझे इंगित करने के लिए ऊपर वोट। धन्यवाद। – Peanut

0

आप टेक्स्टब्लॉक के डेटाकॉन्टेक्स्ट को फर्स्टनाम संपत्ति में सेट करने का प्रयास कर सकते हैं और फिर DataContextChanged ईवेंट का उपयोग कर सकते हैं।

या आप PropertyChanged ईवेंट का उपयोग कर सकते हैं और अपनी इच्छित संपत्ति के लिए फ़िल्टर कर सकते हैं।

किसी भी तरह से मुझे लगता है कि आपको किसी ईवेंट का उपयोग करना होगा।

0

क्या आप किसी मूल्य कनवर्टर के साथ कुछ हैक कर सकते हैं?

<DataTrigger Binding="{Binding Path=FirstName, Converter=FirstNameConverter}" Value="MakeItSo"> 

और

class FirstNameConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return "MakeItSo"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
... 
    } 
} 

मैं यह है कि क्या WPF हर संपत्ति परिवर्तन पर कनवर्टर कॉल पर निर्भर करता है, या क्या यह पहला मान का मूल्यांकन करता है लगता है। मैंने कोशिश नहीं की है, यह सिर्फ एक विचार है ...

+0

हाय मार्क - सुझाव के लिए धन्यवाद। मुझे यकीन नहीं है कि क्यों, लेकिन यह डेटाग्रिड में प्रत्येक पंक्ति के लिए कनवर्टर को आग लग रहा है - इस पर ध्यान दिए बिना कि उस पंक्ति के लिए कोई मूल्य बदल गया है या नहीं। – Peanut

1
<Storyboard x:Key="MessageStoryBoardEntry" FillBehavior="Stop"> 

      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
       <EasingDoubleKeyFrame KeyTime="0:0:00.30" Value="0"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:03" Value="0"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:03.20" Value="1500"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 

     <Storyboard x:Key="MessageStoryBoardExit" FillBehavior="Stop"> 

      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.001" Value="1500"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
संबंधित मुद्दे