2011-06-17 17 views
6

एप्लिकेशन सी # और डब्ल्यूपीएफ के साथ विकसित किया गया है। मेरे पास एक गैर स्थैतिक वर्ग की स्थिर संपत्ति के लिए बाध्यकारी डेटा है। जब एप्लिकेशन शुरू होता है, बाध्यकारी अच्छी तरह से करता है, लेकिन अगर मैं बाध्यकारी के बूल को बदलता हूं, तो दृश्य अपडेट नहीं किया गया है। मैं इस स्थैतिक संपत्ति के बाध्यकारी को कैसे अपडेट कर सकता हूं? अधिसूचित परिवर्तन-घटनाक्रम प्रभावित नहीं होते हैं।स्थिर संपत्ति का बाध्यकारी अद्यतन

वर्ग:

public class ViewTemplateManager : NotifyBase 
{ 
    public static bool CanResizeColumns { get; set; } 

    static ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 

दृश्य:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static Member=viewManager:ViewTemplateManager.CanResizeColumns}}" 
+0

मुझे समझ नहीं आता क्यों इस वर्ग स्थिर है। आप इसे अपने व्यूमोडेल की बेस क्लास के साथ संयोजित करने के लिए विरासत या संगतता का उपयोग कर सकते हैं। यदि आप ऐसा करते हैं, तो आपके पास अपने व्यूमोडेल पर संपत्ति के रूप में CanResizeColumns होगा और सफलतापूर्वक OnPropertyChanged ("PropertyName") का उपयोग करें? –

उत्तर

6

ऐसा करने का एकमात्र तरीका यह है कि यदि आपके पास संबंधित BindingExpression का संदर्भ है।

मान लिया जाये कि आप अपने कोड में अंगूठे के लिए एक संदर्भ है, यह विचार करेंगे की तरह: फिर

public class ViewTemplateManager : NotifyBase 
{ 
    public bool CanResizeColumns { get; set; } 

    public static ViewTemplateManager Instance { get; private set; } 

    static ViewTemplateManager() 
    { 
     Instance = new ViewTemplateManager(); 
    } 

    private ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 
} 

:

var bindingExpression = thumb.GetBindingExpression(Thumb.IsEnabledProperty); 
if (bindingExpression != null) 
    bindingExpression.UpdateTarget(); 

आपका सबसे अच्छा शर्त इतनी तरह एक सिंगलटन पैटर्न का उपयोग करने के लिए, हो सकता है इसलिए जैसे बाँध:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static viewManager:ViewTemplateManager.Instance}, Path=CanResizeColumns}}" 

तो फिर तुम बस जब यो INotifyPropertyChanged.PropertyChanged घटना को बढ़ाने के लिए की जरूरत है आप CanResizeColumns बदल सकते हैं।

+0

यह सिंगलटन पैटर्न के साथ ठीक काम करता है! – Gepro

2

दुर्भाग्य से, वहाँ एक स्थिर संपत्ति के लिए INotifyPropertyChanged की अधिसूचना तंत्र के लिए कोई सीधा बराबर है।

  1. एक उदाहरण स्तर संपत्ति है कि स्थिर सदस्य रिटर्न बनाओ:

    वहाँ सहित कुछ विकल्प होते हैं। परिवर्तन के उदाहरणों को सूचित करने के लिए एक कस्टम तंत्र का उपयोग करें, जिस समय इंस्टेंस PropertyChanged ईवेंट बढ़ा सकता है। यदि आप सदस्यता रद्द करने या कमजोर ईवेंट पैटर्न का उपयोग करने के बारे में सावधान नहीं हैं, तो यह बदसूरत हो सकता है और मेमोरी लीक पेश कर सकता है।

  2. स्थैतिक संपत्ति को सिंगलटन में ले जाएं, और इसे सिंगलटन इंस्टेंस पर इंस्टेंस सदस्य के रूप में रखें। यह उस उदाहरण को सामान्य रूप से PropertyChanged घटनाओं को बढ़ाने की अनुमति देता है।
+0

इस जवाब के बाद 'StaticPropertyChanged' – Wobbles

+0

@wobbles जोड़ा गया था –

2

आप या तो एक Singleton जिस पर संपत्ति स्थिर नहीं है या यदि आप बस भी यह गैर स्थिर है, लेकिन तुम सिर्फ उदाहरण के लिए App उदाहरण में एक उदाहरण बनाने के उपयोग करने वाली प्रॉपर्टी लागू कर सकते हैं (मैं बाद के साथ जाना होगा)। किसी भी मामले में आप फिर से INotifyPropertyChanged लागू कर सकते हैं।

0

मुझे लगता है कि यह आसान समाधान है:

कक्षा संपत्ति:

private static bool isEnabled; //there is Your static 

public bool IsEnabled 
{ 
    get { return isEnabled; } 
    set 
    { 
     isEnabled = value; 
     RaisePropertyChanged("IsEnabled"); //OnPropertyChanged or something 
    } 
} 

XAML:

<Button IsEnabled="{Binding IsEnabled}"/> 
संबंधित मुद्दे