2009-02-28 8 views
8

अद्यतन मैं ऐसे WPF बाइंडिंग कोड है:Oneway बाध्यकारी बंद हो जाता है काम करने के बाद लक्ष्य मैन्युअल

TestModel source = new TestModel(); 
TestModel target = new TestModel(); 

Bind(source, target, BindingMode.OneWay); 

source.Attribute = "1"; 
AssertAreEqual(target.Attribute, "1"); 

target.Attribute = "foo"; 

source.Attribute = "2"; 
AssertAreEqual(target.Attribute, "2"); 

दूसरे दावे विफल रहता है! यह मेरे लिए अजीब लगता है।

इसके अलावा, मैंने 'वनवे' के बजाय 'वनवेटसोर्स' की कोशिश की, और सभी काम अपेक्षित थे।

Bind(source, target, BindingMode.OneWayToSource); 

target.Attribute = "1"; 
AssertAreEqual(source.Attribute, "1"); 

source.Attribute = "foo"; 

target.Attribute = "2"; 
AssertAreEqual(source.Attribute, "2"); 

अन्य विवरण:

void Bind(TestModel source, TestModel target, BindingMode mode) 
{ 
    Binding binding = new Binding(); 
    binding.Source = source; 
    binding.Path = new PropertyPath(TestModel.AttributeProperty); 
    binding.Mode = mode; 
    BindingOperations.SetBinding(target, TestModel.AttributeProperty, binding); 
} 

class TestModel : DependencyObject 
{ 
    public static readonly DependencyProperty AttributeProperty = 
     DependencyProperty.Register("Attribute", typeof(string), typeof(TestModel), new PropertyMetadata(null)); 

    public string Attribute 
    { 
     get { return (string)GetValue(AttributeProperty); } 
     set { SetValue(AttributeProperty, value); } 
    } 
} 

क्या मेरी कोड के साथ गलत क्या है?

उत्तर

13

target.Attribute = "foo" की स्थापना; बाध्यकारी साफ़ किया।

MSDN:

इतना ही गतिशील संसाधनों करते हैं और बाइंडिंग एक स्थानीय मूल्य के रूप में ही पूर्वता पर काम करते हैं, वे वास्तव में एक स्थानीय मान रहे हैं, लेकिन एक मूल्य कि आस्थगित साथ। इस का एक परिणाम यह है कि अगर आप एक गतिशील संसाधन या एक संपत्ति के मूल्य के लिए जगह में बाध्यकारी, किसी भी स्थानीय मूल्य आप द्वारा सेट किए गए बाद में की जगह गतिशील बंधन या पूरी तरह से बाध्यकारी है। यहां तक ​​कि अगर आप को स्थानीय रूप से सेट मान को साफ़ करने के लिए ClearValue को कॉल करते हैं, तो गतिशील संसाधन या बाध्यकारी पुनर्स्थापित नहीं किया जाएगा। वास्तव में, यदि आप पर एक गतिशील संसाधन या बाध्यकारी (बिना "शाब्दिक" स्थानीय मान के साथ) पर ClearValue पर कॉल करें, तो को ClearValue कॉल द्वारा साफ़ किया गया है।

1

बाध्यकारी विशेषज्ञ नहीं है लेकिन मेरा मानना ​​है कि आप एक WPF निर्भरता संपत्ति प्राथमिकता के मुद्दों में भाग रहे हैं। यह संभावना है कि मूल्य निर्धारित करने से बाध्यकारी मूल्य पर प्राथमिकता हो। यही कारण है कि यह बाध्यकारी ओवरराइड करता है। http://msdn.microsoft.com/en-us/library/ms743230.aspx

+0

यह समझता है कि स्टाइल सेट स्टाइल शैली टेम्पलेट मान को ओवरराइड कर देगी, और स्थानीय मान स्टाइल वैल्यू को ओवरराइड करेगा, लेकिन मेरे पास इसका कुछ भी नहीं है। तो सुनिश्चित नहीं है कि यह इस मुद्दे को समझाता है ... किसी भी तरह से धन्यवाद। – alex2k8

+0

इसके अलावा, यह OneWay और OneWayToSource – alex2k8

-1

आप Oneway को मोड बाइंडिंग सेट करते हैं, इसका मतलब है कि सिर्फ एक ही रास्ता में बाध्यकारी काम करता है: लक्ष्य अद्यतन किया जाता है जब स्रोत परिवर्तन

यहाँ एक पूर्ण निर्भरता संपत्ति सूची है।

लेकिन लक्ष्य एक निर्भरता संपत्ति होना चाहिए, और आपके पास कोड एक सीएलआर .NET संपत्ति है। आपको पंजीकृत निर्भरता संपत्ति नाम का उपयोग करके लक्ष्य पर मूल्य निर्धारित करना चाहिए, न केवल सामान्य .NET संपत्ति का नाम। जेरेड का जवाब काफी सही है, इससे डब्ल्यूपीएफ निर्भरता संपत्ति और सामान्य .NET CLR संपत्ति के बीच संघर्ष को हल करने में भ्रम पैदा हो सकता है।

यदि आप सम्मेलन का पालन करते हैं, तो निर्भरता संपत्ति "संपत्ति नाम" + संपत्ति के रूप में होनी चाहिए।

उदाहरण: टेक्स्टप्रोपर्टी टेक्स्टबॉक्स की "टेक्स्ट" निर्भरता संपत्ति है। कोड में इन कॉलिंग होना चाहिए:

TextBox1.TextProperty="value"; 

अधिक जानकारी के लिए बाइंडिंग का स्रोत की स्थापना पर:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

+0

के बीच के अंतर को समझाता नहीं है मैंने दहन से बचने के लिए टेस्टमोडेल जोड़ा ... इसके अलावा, कृपया मेरी बाध्यकारी विधि देखें - मैं WPF डिटेनेसी प्रॉपर्टी का उपयोग कर रहा हूं। मैं सिर्फ WPF प्रॉपर्टी वैल्यू सेट करने के लिए सीएलआर प्रॉपर्टी रैपर का उपयोग करता हूं ... साथ ही, टेक्स्टबॉक्स 1.TextProperty = "value"; आपका क्या अर्थ है? टेक्स्टबॉक्स उदाहरण में केवल टेक्स्ट प्रॉपर्टी है। – alex2k8

0

उदाहरण: TextProperty "पाठ" पाठ बॉक्स की निर्भरता संपत्ति है। कोड में इन्हें कॉल करना चाहिए:

टेक्स्टबॉक्स 1.TextProperty = "value";

WPF गुण दो तरीके से सेट किया जा सकता है:। (। जैसे instance.SetValue (TextProperty, "कुछ पाठ")) DependencyObject.SetValue विधि लागू द्वारा या CLR आवरण का उपयोग कर (जैसे instance.Text = " कुछ पाठ ")।

टेक्स्टबॉक्स। टेक्स्टप्रोपर्टी एक स्थिर निर्भरता प्रॉपर्टी ऑब्जेक्ट है, इसलिए आप किसी संदर्भ प्रकार को स्ट्रिंग मान असाइन नहीं कर सकते हैं।

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