2009-09-28 23 views
10

मैं अपने सिल्वरलाइट अनुप्रयोगों के भीतर मॉडल-व्यू-व्यू मॉडेल पैटर्न का उपयोग करने के लिए सिल्वरलाइट संलग्न व्यवहार तंत्र की खोज कर रहा हूं। शुरू करने के लिए, मैं एक साधारण हैलो वर्ल्ड काम करने की कोशिश कर रहा हूं, लेकिन मैं पूरी तरह से एक त्रुटि में फंस गया हूं जिसके लिए मुझे कोई समाधान नहीं मिल रहा है।कस्टम व्यवहार पर निर्भरता संपत्ति को बाध्य करते समय त्रुटि

मेरे पास अभी क्या एक पृष्ठ है जिसमें केवल एक बटन है जो क्लिक करते समय एक संदेश प्रदर्शित करना चाहिए। क्लिक इवेंट व्यवहार से व्युत्पन्न कक्षा का उपयोग करके संभाला जाता है, और संदेश को व्यवहार की निर्भरता संपत्ति के रूप में निर्दिष्ट किया जाता है। डेटा संदर्भ के रूप में उपयोग किए गए व्यूमोडेल क्लास पर किसी संपत्ति को संदेश प्रॉपर्टी को बाध्य करने का प्रयास करते समय समस्या आती है: मुझे दृश्य में InitializeComponent पर कॉल में एक निष्पादन मिलता है।

यहां मेरे द्वारा उपयोग किए जा रहे सभी कोड हैं, जैसा कि आप देख सकते हैं कि यह अपेक्षाकृत सरल है। सबसे पहले मुख्य पृष्ठ की मार्कअप और देखने में यह शामिल हैं:


MyPage

<UserControl x:Class="MyExample.MyPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MyExample" 
    > 
    <Grid x:Name="LayoutRoot"> 
     <local:MyView/> 
    </Grid> 
</UserControl> 


MyView (TextBlock है सिर्फ इतना है कि बाध्यकारी वाक्य रचना सही है की जांच करने के लिए)

<UserControl x:Class="MyExample.MyView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    xmlns:local="clr-namespace:MyExample" 
    Width="400" Height="300"> 
    <StackPanel Orientation="Vertical" x:Name="LayoutRoot" Background="White"> 
     <StackPanel.Resources> 
      <local:MyViewmodel x:Key="MyResource"/> 
     </StackPanel.Resources> 
     <TextBlock Text="This button will display the following message:"/> 
     <TextBlock Text="{Binding MyMessage, Source={StaticResource MyResource}}" FontStyle="Italic"/> 
     <Button x:Name="MyButton" Content="Click me!"> 
      <i:Interaction.Behaviors> 
       <local:MyBehavior Message="{Binding MyMessage, Source={StaticResource MyResource}}"/> 
      </i:Interaction.Behaviors> 
     </Button> 
    </StackPanel> 
</UserControl> 


अब कोड, वहाँ दो वर्ग हैं: व्यवहार के लिए एक और viewmodel के लिए एक और एक:

MyViewmodel

public class MyViewmodel 
{ 
    public string MyMessage 
    { 
     get { return "Hello, world!"; } 
    } 
} 


MyBehavior

public class MyBehavior : Behavior<Button> 
{ 
    public static readonly DependencyProperty MessageProperty = 
     DependencyProperty.Register("Message", 
     typeof(string), typeof(MyBehavior), 
     new PropertyMetadata("(no message)")); 

    public string Message 
    { 
     get { return (string)GetValue(MessageProperty); } 
     set { SetValue(MessageProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.Click += new RoutedEventHandler(AssociatedObject_Click); 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.Click -= new RoutedEventHandler(AssociatedObject_Click); 
    } 

    void AssociatedObject_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(Message); 
    } 
} 


सरल पर्याप्त, लेकिन यह कोड चलने पर AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 15 Position: 43] (संदेश संपत्ति के लिए निर्धारित मूल्य की शुरुआत में) अपवाद फेंकता है। मुझे यकीन है कि मुझे कुछ याद आ रहा है, लेकिन क्या?

अतिरिक्त जानकारी: यदि मैं MyBehavior पर संदेश प्रॉपर्टी से बाइंडिंग को हटा देता हूं (यानी, यदि मैं किसी भी स्थिर स्ट्रिंग पर अपना मान निर्धारित करता हूं), तो यह ठीक काम करता है। इसके अलावा, मैं Silverlight 3 RTW को लक्षित कर रहा हूं।

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


अद्यतन

ऐसा लगता है कि WPF के विपरीत, सिल्वरलाइट किसी भी DependencyObject से पाने वस्तु पर बाध्यकारी डेटा का समर्थन नहीं करता है, लेकिन केवल FrameworkElement से पाने वस्तुओं पर। यह व्यवहार के लिए कोई मामला नहीं है, इसलिए बाध्यकारी काम नहीं करता है।

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


अद्यतन 2

सरोगेट बांधने की मशीन काम नहीं करता है जब FrameworkElement एक Interaction.Behaviors उप-तत्व शामिल हैं।

मुझे एक और समाधान here मिला है, और यह काम करने लगता है। इस बार, इस्तेमाल की गई चाल दीपसेटर है। आप ऐसे स्टार्टर्स में से एक को स्टैकपैनल पर स्थिर संसाधन के रूप में परिभाषित करते हैं, और फिर व्यवहार से संसाधन का संदर्भ देते हैं। तो मेरी उदाहरण में, हम StackPanel संसाधन अनुभाग इस प्रकार का विस्तार करना चाहिए:

<StackPanel.Resources> 
    <local:MyViewmodel x:Key="MyResource"/> 
    <local:DeepSetter 
     x:Key="MyBehaviorSetter" 
     TargetProperty="Message" 
     BindingExport="{Binding MyMessage, Source={StaticResource MyResource}}"/> 
</StackPanel.Resources> 

... और इस प्रकार बटन के व्यवहार घोषणा संशोधित:

<local:MyBehavior local:DeepSetter.BindingImport="{StaticResource MyBehaviorSetter}"/> 

अद्यतन 3

अच्छा समाचार: किसी भी DependecyObject के लिए डेटा बाइंडिंग सिल्वरलाइट 4: http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#dobind

+1

में समर्थन प्रदान करेगा मैं एसएल 4 के साथ एक कस्टम डीपी के साथ एक व्यवहार का उपयोग करता हूं, मुझे कोई त्रुटि नहीं मिली है लेकिन बाध्यकारी का उपयोग नहीं किया जाता है यानी गेटर/सेटर स्रोत कभी नहीं कहा जाता है। क्या आप ने कोशिश की ? – MatthieuGD

+0

मैं SilverLight3 में बंद कर दिया गया है इसलिए मैंने एक विस्तार विधि बनाई है जो मुझे नियंत्रण से बाहर व्यवहार निकालने और वांछित संपत्ति सेट करने की अनुमति देती है। यह हैकी है लेकिन यह अन्यथा काम नहीं कर सका। – jtruelove

उत्तर

1

पर उपलब्ध होगा डेटावर्किंग समर्थन प्राप्त करें क्लास फ्रेमवर्क एलीमेंट से प्राप्त होना चाहिए। एमएसएफटी होपिंग सिल्वरलाइट 4

+0

दरअसल, यह सिल्वरलाइट 4 में समर्थित है: http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#dobind – Konamiman

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