2009-06-01 20 views
143

मुझे एक टेक्स्ट बॉक्स में एक साधारण स्थैतिक स्ट्रिंग संपत्ति को बाध्य करने में कठिनाई हो रही है।स्थैतिक संपत्ति के लिए बाध्यकारी

यहाँ स्थिर संपत्ति के साथ वर्ग है:

public class VersionManager 
{ 
    private static string filterString; 

    public static string FilterString 
    { 
     get { return filterString; } 
     set { filterString = value; } 
    } 
} 

मेरी XAML में, मैं सिर्फ एक पाठ बॉक्स को यह स्थिर संपत्ति बाध्य करने के लिए चाहते हैं:

<TextBox> 
    <TextBox.Text> 
     <Binding Source="{x:Static local:VersionManager.FilterString}"/> 
    </TextBox.Text> 
</TextBox> 

सब कुछ संकलित, लेकिन रन टाइम पर , मुझे निम्न अपवाद मिलता है:

विशेषता 'स्रोत' में मान को परिवर्तित नहीं कर सकता o 'System.Windows.Markup.StaticExtension' का ऑब्जेक्ट। लाइन 57 स्थिति 29.

किसी भी विचार मैं गलत क्या कर रही हूं; वस्तु मार्कअप फ़ाइल 'घटक/selectversionpagefunction.xaml BurnDisk' में 'System.Windows.Data.Binding' पर त्रुटि?

उत्तर

144

बाध्यकारी जरूरतों दो तरह से हो सकता है, यदि आप एक पथ की आपूर्ति चाहिए। स्थिर संपत्ति पर दो-तरफा बाध्यकारी करने की एक चाल है, बशर्ते कक्षा स्थिर न हो: संसाधनों में कक्षा का डमी उदाहरण घोषित करें, और बाध्यकारी के स्रोत के रूप में इसका उपयोग करें।

<Window.Resources> 
    <local:VersionManager x:Key="versionManager"/> 
</Window.Resources> 
... 

<TextBox Text="{Binding Source={StaticResource versionManager}, Path=FilterString}"/> 
+0

यह उत्तर मेरे मामले के लिए अधिक उपयुक्त है क्योंकि मैं अपने स्रोत वर्ग में निर्भरता ऑब्जेक्ट पेश नहीं करना चाहता हूं। पारितोषिक के लिए धन्यवाद! –

+4

ध्यान दें कि आपके टेक्स्ट बॉक्स को मूल्य को स्थिर संपत्ति में वापस धक्का देने में सक्षम होगा, लेकिन स्रोत मान में परिवर्तन होने पर टेक्स्टबॉक्स को अपडेट नहीं किया जाएगा। –

+0

यह ठीक है, मुझे बस इस मामले में टेक्स्टबॉक्स से बाइंडिंग की आवश्यकता है। अगर मैं बाध्यकारी को दूसरी तरह से काम करना चाहता हूं, तो मुझे इन तरीकों में से किसी एक की आवश्यकता के बारे में पता है: INotifyPropertyChanged, परिवर्तित घटना या निर्भरता संपत्ति। –

88

आप इस तरह के स्थिर से बंधे नहीं जा सकते हैं। बाध्यकारी आधारभूत संरचना के अपडेट के बारे में सूचित करने का कोई तरीका नहीं है क्योंकि DependencyObject (या INotifyPropertyChanged लागू करने वाला ऑब्जेक्ट उदाहरण) शामिल है।

यदि वह मान नहीं बदलता है, तो बस बाध्यकारी को हटा दें और सीधे Text संपत्ति के अंदर x:Static का उपयोग करें। VersionManager क्लास का नामस्थान (और असेंबली) स्थान होने के लिए नीचे app परिभाषित करें।

<TextBox Text="{x:Static app:VersionManager.FilterString}" /> 

यदि मूल्य बदलता है, तो मैं मूल्य जोड़ने और उसमें बांधने के लिए एक सिंगलटन बनाने का सुझाव दूंगा।

सिंगलटन का एक उदाहरण:

public class VersionManager : DependencyObject { 
    public static readonly DependencyProperty FilterStringProperty = 
     DependencyProperty.Register("FilterString", typeof(string), 
     typeof(VersionManager), new UIPropertyMetadata("no version!")); 
    public string FilterString { 
     get { return (string) GetValue(FilterStringProperty); } 
     set { SetValue(FilterStringProperty, value); } 
    } 

    public static VersionManager Instance { get; private set; } 

    static VersionManager() { 
     Instance = new VersionManager(); 
    } 
} 
<TextBox Text="{Binding Source={x:Static local:VersionManager.Instance}, 
         Path=FilterString}"/> 
+2

सच? मैं स्थैतिक Int32.MaxValue से जुड़ा हुआ हूं जो मेरे नमूने के समान है: <टेक्स्टबॉक्स टेक्स्ट = {बाध्यकारी स्रोत = {x: स्टेटिक sys: Int32.MaxValue}, मोड = वनवे} "/> क्या यह काम कर रहा है क्योंकि यह एक तरीका है? –

+2

हाँ, किसी भी दो तरह के बाध्यकारी को बाध्यकारी पर पथ संपत्ति मूल्य की आवश्यकता होती है। स्रोत को उस ऑब्जेक्ट की आवश्यकता होती है जिसमें पथ निर्दिष्ट निर्दिष्ट है। OneWay निर्दिष्ट करना उस प्रतिबंध को हटा देता है। –

+0

इसके अलावा, देर से अपडेट के लिए खेद है, लेकिन मैंने उपरोक्त उत्तर को नमूना के साथ अपडेट किया है। –

34

.NET 4.5 में यह स्थिर गुणों के बाध्य करने के लिए संभव है, read more

आप एक डेटा बाइंडिंग के स्रोत के रूप स्थिर गुणों का उपयोग कर सकते हैं। डेटा बाइंडिंग इंजन पहचानता है कि स्थैतिक ईवेंट उठाए जाने पर संपत्ति का मूल्य बदलता है। उदाहरण के लिए, यदि क्लास SomeClass MyProperty नामक स्थैतिक संपत्ति को परिभाषित करता है, तो SomeClass एक स्थैतिक ईवेंट परिभाषित कर सकता है जो MyProperty के मान में परिवर्तन होने पर उठाया जाता है।पहले मामले में, वर्ग PropertyNameChanged नाम के एक स्थिर घटना है कि ईवेंट हैंडलर को EventArgs गुजरता को उजागर करता है कि

public static event EventHandler MyPropertyChanged; 
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; 

नोट: स्थिर घटना निम्नलिखित हस्ताक्षर किसी का भी उपयोग कर सकते हैं। दूसरे मामले में, कक्षा नामक एक स्थिर घटना का खुलासा करती है StaticPropertyChanged जो PropertyChangedEventArgs को ईवेंट हैंडलर में पास करता है। एक वर्ग जो स्थैतिक संपत्ति लागू करता है, किसी भी विधि का उपयोग करके संपत्ति परिवर्तन सूचनाएं बढ़ाने के लिए चुन सकता है।

+0

अगर कोई और पढ़ना चाहता है तो यहां लिंक है। माइक्रोसॉफ्ट ने इसे नीचे ले लिया, लेकिन यह यहां वेब संग्रह पर है। https://web.archive.org/web/20131129053934/http://msdn.microsoft.com/en-US/library/bb613588 – matrixugly

+0

कुछ उदाहरण कृपया ... – user1034912

+0

यह उत्तर मुझे सही दिशा में इंगित करता है, लेकिन उदाहरण के बिना विवरणों को पूरा करने में अभी भी कुछ समय लगा। मैंने मूल कोड के आधार पर एक [उदाहरण] (https://stackoverflow.com/a/47428015/5024) लिखा है। – Matt

7

आप ObjectDataProvider कक्षा का उपयोग कर सकते हैं और यह MethodName संपत्ति है। यह इस तरह से देख सकते हैं:

<Window.Resources> 
    <ObjectDataProvider x:Key="versionManager" ObjectType="{x:Type VersionManager}" MethodName="get_FilterString"></ObjectDataProvider> 
</Window.Resources> 

घोषित वस्तु डेटा प्रदाता इस तरह इस्तेमाल किया जा सकता:

<TextBox Text="{Binding Source={StaticResource versionManager}}" /> 
5

आप स्थानीय संसाधनों आप नीचे के रूप में उन्हें का उल्लेख कर सकते उपयोग कर रहे हैं:

<TextBlock Text="{Binding Source={x:Static prop:Resources.PerUnitOfMeasure}}" TextWrapping="Wrap" TextAlignment="Center"/> 
3

static संपत्ति को बांधने के लिए दो तरीके/वाक्यविन्यास हो सकते हैं। यदि पी वर्ग MainWindow, तो में एक static संपत्ति है textbox के लिए binding हो जाएगा:

1.

<TextBox Text="{x:Static local:MainWindow.p}" /> 

2. पर

<TextBox Text="{Binding Source={x:Static local:MainWindow.p},Mode=OneTime}" /> 
2

देखो मेरी परियोजना CalcBinding, जो आपको पथ गुण मूल्य में जटिल अभिव्यक्ति लिखने के लिए प्रदान करता है, जिसमें स्थैतिक गुण, स्रोत गुण, गणित और अन्य शामिल हैं। तो, आप इसे लिख सकते हैं:

<TextBox Text="{c:Binding local:VersionManager.FilterString}"/> 

गुडलक!

2

WPF 4.5 के रूप में आप सीधे स्थिर गुणों से जुड़ सकते हैं और बाध्यकारी स्वचालित रूप से अपडेट हो सकती है जब आपकी संपत्ति बदल जाती है। बाध्यकारी अद्यतनों को ट्रिगर करने के लिए आपको मैन्युअल रूप से एक परिवर्तन ईवेंट को तार करने की आवश्यकता है।

public class VersionManager 
{ 
    private static String _filterString;   

    /// <summary> 
    /// A static property which you'd like to bind to 
    /// </summary> 
    public static String FilterString 
    { 
     get 
     { 
      return _filterString; 
     } 

     set 
     { 
      _filterString = value; 

      // Raise a change event 
      OnFilterStringChanged(EventArgs.Empty); 
     } 
    } 

    // Declare a static event representing changes to your static property 
    public static event EventHandler FilterStringChanged; 

    // Raise the change event through this static method 
    protected static void OnFilterStringChanged(EventArgs e) 
    { 
     EventHandler handler = FilterStringChanged; 

     if (handler != null) 
     { 
      handler(null, e); 
     } 
    } 

    static VersionManager() 
    { 
     // Set up an empty event handler 
     FilterStringChanged += (sender, e) => { return; }; 
    } 

} 

अब आप किसी भी अन्य की तरह अपने स्थिर संपत्ति बाध्य कर सकते हैं:

<TextBox Text="{Binding Path=(local:VersionManager.FilterString)}"/> 
संबंधित मुद्दे