5

मैं एक WinRT/मेट्रो एप्लिकेशन के लिए कस्टम नियंत्रण विकसित करने की कोशिश कर रहा हूं।विनरेट कस्टम कंट्रोल निर्भरता संपत्ति सेटिंग/बाध्यकारी

इसकी एक निर्भरता संपत्ति है और मैं कस्टम नियंत्रण में अपना मूल्य निर्धारित करने में सक्षम होना चाहता हूं। हालांकि, SetValue का उपयोग किसी भी बाइंडिंग को तोड़ता है जो नियंत्रण के उपभोक्ताओं ने बनाया हो सकता है।

मुझे मिले समाधानों में से कोई भी नहीं (उदा। SetCurrentValue) WinRT/Metro पर लागू होता प्रतीत होता है। क्या इसका कोई उपाय है?

ऐसा करने के लिए एक साधारण चीज़ की तरह लगता है - और ईमानदारी से! - मैंने यहां और कहीं और एक समाधान खोजने की कोशिश की है। किसी भी तरह की सहायता का स्वागत किया जाएगा।

उत्तर

2

आप संपत्ति मेटाडाटाटा में डिफ़ॉल्ट मान सेट कर सकते हैं (डॉ डब्लूपीएफ के snippets बचाव के लिए!)।

#region IsAvailable 
private static bool DefaultIsAvailable = false; 

/// <summary> 
/// IsAvailable Dependency Property 
/// </summary> 
public static readonly DependencyProperty IsAvailableProperty = 
    DependencyProperty.Register(
     "IsAvailable", 
     typeof(bool), 
     typeof(CustomControl1), 
     new PropertyMetadata(DefaultIsAvailable, OnIsAvailableChanged)); 

/// <summary> 
/// Gets or sets the IsAvailable property. This dependency property 
/// indicates .... 
/// </summary> 
public bool IsAvailable 
{ 
    get { return (bool)GetValue(IsAvailableProperty); } 
    set { SetValue(IsAvailableProperty, value); } 
} 

/// <summary> 
/// Handles changes to the IsAvailable property. 
/// </summary> 
/// <param name="d"> 
/// The <see cref="DependencyObject"/> on which 
/// the property has changed value. 
/// </param> 
/// <param name="e"> 
/// Event data that is issued by any event that 
/// tracks changes to the effective value of this property. 
/// </param> 
private static void OnIsAvailableChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var target = (CustomControl1)d; 
    bool oldIsAvailable = (bool)e.OldValue; 
    bool newIsAvailable = target.IsAvailable; 
    target.OnIsAvailableChanged(oldIsAvailable, newIsAvailable); 
} 

/// <summary> 
/// Provides derived classes an opportunity to handle changes 
/// to the IsAvailable property. 
/// </summary> 
/// <param name="oldIsAvailable">The old IsAvailable value</param> 
/// <param name="newIsAvailable">The new IsAvailable value</param> 
protected virtual void OnIsAvailableChanged(
    bool oldIsAvailable, bool newIsAvailable) 
{ 
} 
#endregion 

संपादित करें *

आप मूल्य बदलना चाहते हैं - आप कर सकते हैं, लेकिन अगर आप एक बुनियादी बाध्यकारी है कि है OneWay का उपयोग करें - यानी - यह एक बाध्यकारी स्रोत से मूल्य लेता है और करने के लिए यह सेट निर्भरता संपत्ति - बाध्यकारी काम करना बंद कर देगा क्योंकि स्रोत और लक्ष्य मान अब और सिंक्रनाइज़ नहीं किए जाएंगे।

यदि आप Mode="TwoWay" सेट करते हैं - बाध्यकारी स्रोत अपडेट किया जाएगा जब बाध्यकारी लक्ष्य (आपका नियंत्रण) निर्भरता गुण को संशोधित करता है, इसलिए बाध्यकारी वैध रहेगी और दोनों तरीकों से काम करना जारी रखेगी।

+0

आपका उत्तर बताता है कि मूल्य सेटिंग बाध्यकारी को तोड़ती है - यही वजह है कि मैंने सवाल पूछा था। एकमात्र विकल्प जो मैं सोच सकता हूं वह है IotifyPropertyChanged को लागू करना और "नियमित" संपत्ति का उपयोग करना - लेकिन फिर उपयोगकर्ता इसे बाध्य नहीं कर सकते हैं। –

+0

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

+1

http://msdn.microsoft.com/en-us/library/windows/apps/hh700353 बाइंडिंग को निर्भरता संपत्ति मूल्य प्राथमिकता के प्रयोजनों के लिए स्थानीय मान के रूप में माना जाता है, जिसका अर्थ है कि यदि आप एक और स्थानीय मूल्य निर्धारित करते हैं मूल रूप से बाध्यकारी मूल्य रखने वाली संपत्ति के लिए, आप बाध्यकारी को खत्म कर देंगे। यह व्यवहार है जो मुझे लगता है कि –