2009-03-02 21 views
17

हैं वहाँ किसी भी डेटा बाइंडिंग चौखटे (बीसीएल या अन्यथा) है कि किसी भी दो CLR गुण कि INotifyPropertyChanged और INotifyCollectionChanged लागू के बीच बंधन की अनुमति देते हैं?डाटा बाइंडिंग POCO गुण

var binding = new Binding(); 
binding.Source = someSourceObject; 
binding.SourcePath = "Customer.Name"; 
binding.Target = someTargetObject; 
binding.TargetPath = "Client.Name"; 
BindingManager.Bind(binding); 

कहाँ someSourceObject और someTargetObject सिर्फ Pocos कि INotifyPropertyChanged को लागू कर रहे हैं: यह यह कुछ इस तरह करने के लिए संभव हो जाना चाहिए हो रहा है। हालांकि, मुझे इसके लिए किसी भी बीसीएल समर्थन से अनजान है, और मुझे यकीन नहीं है कि मौजूदा फ्रेमवर्क हैं जो इस पर अनुमति देते हैं।

अद्यतन: यह देखते हुए कि कोई मौजूदा लाइब्रेरी उपलब्ध नहीं है, मैंने इसे स्वयं लिखने के लिए खुद पर लिया है। यह here उपलब्ध है।

धन्यवाद

उत्तर

10

मैंने शून्य को भरने के लिए Truss लिखा था।

1

AutoMapper दो उदाहरणों के बीच मूल्यों कॉपी कर सकते हैं, लेकिन आप इस स्वचालित रूप से ऐसा करने के लिए अपने खुद के कोड लिखने के लिए की है।

1

शायद Bindable LINQ या continuous linq यहां सहायता कर सकते हैं। यदि आप मॉडल गुणों को जोड़ने की कोशिश कर रहे हैं जो वास्तव में आपके वास्तविक, अद्यतन डेटा के "व्युत्पन्न गुण" हैं, ताकि यूआई आपके लिए बाध्य हो सके, इन दो ढांचे को मदद करनी चाहिए।

7

मुझे किसी भी लाइब्रेरी से अवगत नहीं है जो यह करता है - लेकिन आप अपना खुद का आसानी से लिख सकते हैं। इस कोड में कुछ तफ़सील का अभाव

public static class Binder 
{ 

    public static void Bind(
     INotifyPropertyChanged source, 
     string sourcePropertyName, 
     INotifyPropertyChanged target, 
     string targetPropertyName) 
    { 
     var sourceProperty 
      = source.GetType().GetProperty(sourcePropertyName); 
     var targetProperty 
      = target.GetType().GetProperty(targetPropertyName); 

     source.PropertyChanged += 
      (s, a) => 
      { 
       var sourceValue = sourceProperty.GetValue(source, null); 
       var targetValue = targetProperty.GetValue(target, null); 
       if (!Object.Equals(sourceValue, targetValue)) 
       { 
        targetProperty.SetValue(target, sourceValue, null); 
       } 
      }; 

     target.PropertyChanged += 
      (s, a) => 
      { 
       var sourceValue = sourceProperty.GetValue(source, null); 
       var targetValue = targetProperty.GetValue(target, null); 
       if (!Object.Equals(sourceValue, targetValue)) 
       { 
        sourceProperty.SetValue(source, targetValue, null); 
       } 
      }; 
    } 
} 
बेशक

,:

यहाँ एक आधार मैं कुछ ही मिनटों कि दो साधारण गुणों के बीच बंधन दो तरह से डेटा स्थापित करता है में खटखटाया है। जोड़ने के लिए चीजें शामिल

  • जांच की जा रही है कि source और target आवंटित कर रहे हैं
  • जांच की जा रही है कि गुण sourcePropertyName और targetPropertyName से पहचान मौजूद
  • दो गुण

इसके अलावा बीच प्रकार संगतता के लिए जाँच हो रही है, प्रतिबिंब अपेक्षाकृत धीमी है (हालांकि इसे हटाने से पहले इसे बेंचमार्क करें, यह नहीं है धीमा), तो आप संकलित का उपयोग करना चाहेंगे इसके बजाय अभिव्यक्तियां।

आखिरकार, स्ट्रिंग द्वारा गुण निर्दिष्ट करने के बाद त्रुटि प्रवण है, आप इसके बजाय लिंक अभिव्यक्तियों और एक्सटेंशन विधियों का उपयोग कर सकते हैं। तो बजाय

Binder.Bind(source, "Name", target, "Name") 

लिखने की आप

source.Bind(Name => target.Name); 
+0

मैं वास्तव में पूछ रहा था क्योंकि मैं अपना खुद का लेखन करने पर विचार कर रहा था। पहिया और सभी को फिर से शुरू नहीं करना चाहता था ... धन्यवाद। –

+0

अपडेट: मैंने प्रश्न में अपनी लाइब्रेरी से लिंक किया है। –

+0

मुझे अपने वर्तमान प्रोजेक्ट-इन-ए-जल्दी के लिए एक साधारण बेरबोन डाटाबेसिंग क्लास की आवश्यकता थी, और उपर्युक्त एक जो मुझे चाहिए वह लगभग फिट बैठता है। मैंने दो कार्य प्रतिनिधियों द्वारा प्रतिबिंब के साथ प्रयुक्त संपत्ति नामों को प्रतिस्थापित किया जिसमें मुझे पीओसीओ से मिलता/सेट किया गया और परिवर्तन और स्वरूपण लागू किया गया। मैं निश्चित रूप से अगले प्रोजेक्ट में ट्रस की अच्छी कोशिश करूँगा, क्योंकि यह वास्तव में मेरे लिए हस्तक्षेप करता है। – Larry

-2

लिख सकता है आप DependencyProperty की आप यह कर सकता है के रूप में अपने गुण परिभाषित हैं। डब्ल्यूएफ और डब्ल्यूपीएफ दोनों में इसका कार्यान्वयन है (पहला लिंक डब्ल्यूपीएफ के लिए है। डब्ल्यूएफ के लिए यह this एक है) इसलिए आपको यह तय करने की ज़रूरत है कि किस का उपयोग करना है - लेकिन दोनों को आपकी जरूरतों के लिए पर्याप्त होना चाहिए।

+2

निर्भरता प्रॉपर्टी का मतलब निर्भरता ऑब्जेक्ट से विरासत में है, जो एक पीओसीओ नहीं है। –

+1

+1। दूसरे शब्दों में, "आप पोको, केवल डीपी के साथ नहीं कर सकते हैं।" – Will

+0

एह? यह सुनिश्चित नहीं है कि यह तर्क देने के लिए आपका तर्क क्या है। मेरी जरूरतों के लिए कोई भी सुझाव पर्याप्त नहीं होगा क्योंकि न तो सुझाव में पीओसीओ शामिल हैं। एक और पोस्ट पहले ही दिखा चुका है कि आप इसे पीओसीओ के साथ कर सकते हैं - मैं बस एक ढांचा मांग रहा हूं जो कड़ी मेहनत करता है। –

0

मैंने एक छोटा Bind प्रोजेक्ट लिखा है जिसमें नेस्टेड गुण एसिंक बाध्यकारी क्रियाओं के बीच बाध्यकारी के लिए पूर्ण समर्थन है। सिंटैक्स सरल नहीं हो सकता:

//Two way binding between neasted properties: 
Bind.TwoWay(()=> client.Area.Data.Name == this.AreaName); 

//On change action execute: 
Bind 
    .OnChange(()=> client.Personal.Name) 
    .Do(x => clientName = x);