2009-09-01 14 views
22

पर निर्भर करती है, एक निर्भरता संपत्ति कैसे पंजीकृत कर सकता है जिसका मूल्य किसी अन्य निर्भरता संपत्ति के मूल्य का उपयोग करके गणना की जाती है?निर्भरता संपत्ति किसी अन्य

क्योंकि .NET प्रॉपर्टी रैपर को रन-टाइम पर WPF द्वारा छोड़ा जाता है, इसलिए किसी को गेटर्स और सेटर्स में तर्क शामिल नहीं करना चाहिए। इसका समाधान आमतौर पर PropertyChangedCallback एस का उपयोग करना है। लेकिन उनको स्थिर घोषित किया जाता है।

public bool TestBool 
{ 
    get { return (bool)GetValue(TestBoolProperty); } 
    set 
    { 
    SetValue(TestBoolProperty, value); 
    TestDouble = ((value)?(100.0):(200.0)); // HERE IS THE DEPENDENCY 
    } 
} 
public static readonly DependencyProperty TestBoolProperty = 
    DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel)); 

public double TestDouble 
{ 
    get { return ((double)GetValue(TestDoubleProperty)); } 
    set { SetValue(TestDoubleProperty, value); } 
} 
public static readonly DependencyProperty TestDoubleProperty = 
    DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel)); 

जब तक निर्भरता परिपत्र नहीं है, वहाँ यह पूरा करने के लिए एक उचित साधन है:

उदाहरण के लिए, उचित तरीके से इस काल्पनिक कार्य को पूरा करने के लिए क्या है?

उत्तर

21

हममम ... मुझे लगता है कि आप निर्भरता गुण value coercion में बेहतर लग रहे हैं: यहाँ कैसे। यहां जबरदस्ती के साथ एक उदाहरण दिया गया है:

public class ViewModel : DependencyObject 
{ 
    public bool TestBool 
    { 
    get { return (bool)GetValue(TestBoolProperty); } 
    set { SetValue(TestBoolProperty, value); } 
    } 
    public static readonly DependencyProperty TestBoolProperty = 
    DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel), new PropertyMetadata(false, OnTestBoolPropertyChanged)); 

    private static void OnTestBoolPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
    var vm = (ViewModel)d; 
    vm.CoerceValue(TestDoubleProperty); 
    } 

    public double TestDouble 
    { 
    get { return ((double)GetValue(TestDoubleProperty)); } 
    set { SetValue(TestDoubleProperty, value); } 
    } 
    public static readonly DependencyProperty TestDoubleProperty = 
    DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel), new PropertyMetadata(0.0, null, OnCoerceTestDouble)); 

    private static object OnCoerceTestDouble(DependencyObject d, object baseValue) 
    { 
    var vm = (ViewModel) d; 
    var testBool = vm.TestBool; 
    return ((testBool) ? (100.0) : (200.0)); 
    } 
} 
+0

'CoerceValueCallback' का उपयोग करने का क्या फायदा है जैसा आपने एक निर्भरता संपत्ति को प्रत्यक्ष रूप से बदलकर बना दिया है, एक अन्य निर्भरता संपत्ति के' PropertyChangedCallback' के रूप में opedog किया था? मैं आपके द्वारा लिंक किए गए दस्तावेज से इकट्ठा करता हूं कि आपका अधिक उचित तरीका है, लेकिन मैं व्यावहारिक अंतर के बारे में उत्सुक हूं। – Gregyski

+1

ठीक है, जोड़े को नाम देने के लिए: यह इस संपत्ति के लिए बाइंडिंग नहीं तोड़ता है (यानी यदि यह संपत्ति बाध्यकारी अभिव्यक्ति का लक्ष्य है तो यह कोरिंग के बाद काम करेगी लेकिन स्पष्ट सेट के बाद खो जाएगी); निर्भरता संपत्ति मूल्य संकल्प में इसकी उच्च प्राथमिकता है (यानी यदि आप प्रोपा = "कुछ" कहते हैं जिसका अर्थ यह नहीं है कि प्रोपा == "कुछ", क्योंकि मजबूती उस असाइनमेंट को अनदेखा कर सकती है); यह आपकी संपत्ति के पुराने मूल्य को याद करता है (यानी अगली बार जब आप CoerceValue() को कॉल करेंगे तो आपको टेस्टडबल का मूल मान मिलेगा, न कि स्थानीय रूप से सेट किया गया था) – Anvaka

1

आप वास्तव में सही हैं, आपको PropertyChangedCallback का उपयोग करना चाहिए।

public bool TestBool 
{ 
    get { return (bool)GetValue(TestBoolProperty); } 
    set 
    { 
    SetValue(TestBoolProperty, value); 
    } 
} 
public static readonly DependencyProperty TestBoolProperty = 
    DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel), 
    new PropertyMetadata(false, new PropertyChangedCallback(OnTestBoolChanged))); 

private static void OnTestBoolChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    ViewModel vm = d as ViewModel; 
    vm.TestDouble = value ? 100.0 : 200.0; 
} 

public double TestDouble 
{ 
    get { return ((double)GetValue(TestDoubleProperty)); } 
    set { SetValue(TestDoubleProperty, value); } 
} 
public static readonly DependencyProperty TestDoubleProperty = 
    DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel)); 
+0

धन्यवाद ओपेडॉग। मेरी जांच में, मैं मूर्खतापूर्वक जांच कर रहा था कि 'PropertyChangedCallback' में क्या पारित किया गया था। मैंने इस विधि का उपयोग करने के लिए अपनी परीक्षण परियोजना को समायोजित किया और यह काम कर रहा है। मैं अगले अंवाका के समाधान का प्रयास करने जा रहा हूं। – Gregyski

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