2012-03-20 9 views
6

मेरे पास एक वेरिएबल था जो स्थैतिक नहीं था और INotifyPropertyChanged सफलतापूर्वक कार्यान्वित किया गया था। फिर मैंने इसे वैश्विक बनाने की कोशिश की, इसलिए इसे एक स्थिर चर बना दिया। लेकिन इस बार, INotifyPropertyChanged काम नहीं करता है। कोई भी समाधान?INotifyProperty स्थिर चर के लिए चेंग

+0

[स्थिर संपत्ति के लिए बाइंडिंग] के संभावित डुप्लिकेट UpdateSourceTrigger साथ बाइंडिंग के लिए इस संपत्ति को अद्यतन करने के (http://stackoverflow.com/questions/936304/binding-to-static-property) –

उत्तर

21

INotifyPropertyChanged उदाहरण गुणों पर काम करता है। एक समाधान एक सिंगलटन पैटर्न का उपयोग करना और INotifyPropertyChanged रखना है, दूसरा श्रोताओं को सूचित करने के लिए अपने स्वयं के कार्यक्रम का उपयोग करना है।

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

public sealed class MyClass: INotifyPropertyChanged 
{ 
    private static readonly MyClass instance = new MyClass(); 
    private MyClass() {} 

    public static MyClass Instance 
    { 
     get 
     { 
     return instance; 
     } 
    } 

    // notifying property 
    private string privMyProp; 
    public string MyProp 
    { 
     get { return this.privMyProp; } 

     set 
     { 
      if (value != this.privMyProp) 
      { 
       this.privMyProp = value; 
       NotifyPropertyChanged("MyProp"); 
      } 
     } 
    } 


    // INotifyPropertyChanged implementation 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

संपादित: WPF 4.5 में, वे शुरू की संपत्ति स्थिर गुणों के लिए मैकेनिक बदल दिया है:

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

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

सिंगलटन सुझाव –

+0

के लिए +1 एक छोटा सा उदाहरण? – Shibli

+0

@Shilbi क्या एक छोटा सा उदाहरण है? – chopikadze

5

बहुत अच्छा उदाहरण है, मैं आवेदन में कुछ सामान्य सेटिंग के लिए यह प्रयोग किया जाता है, जब मैं घटकों के लिए कुछ संपत्ति ऑनलाइन बाध्य करने के लिए चाहते हैं

public sealed class DataGridClass:INotifyPropertyChanged 
{ 
     private static readonly DataGridClass instance = new DataGridClass(); 
     private DataGridClass() { } 

     public static DataGridClass Instance 
     { 
      get 
      { 
      return instance; 
      } 
     } 

    private int _DataGridFontSize {get;set;} 

    public int DataGridFontSize 
    { 
     get { return _DataGridFontSize; } 
     set { _DataGridFontSize = value; 
      RaisePropertyChanged("DataGridFontSize"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

सेट स्टार्टअप गुण:

DataGridClass.Instance.DataGridFontSize = 14(or read from xml) 

इसे घटकों के गुणों से बांधें

xmlns:static="clr-namespace:MyProject.Static" 
<extgrid:ExtendedDataGrid x:Name="testGrid" ClipboardCopyMode="IncludeHeader" AutoGenerateColumns="False"> 
<extgrid:ExtendedDataGrid.Resources> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="FontSize" 
     Value="{Binding Source={x:Static static:DataGridClass.Instance}, 
     Path=DataGridFontSize, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 
    </Style> 
</extgrid:ExtendedDataGrid.Resources> 

जब आप "वरीयताएँ" की तरह आवेदन में कहीं भी यह राशि बदल -> डेटा ग्रिड FONTSIZE - यह स्वचालित रूप से

private void comboBoxFontSize_DropDownClosed(object sender, EventArgs e) 
    { 
     DataGridClass.Instance.DataGridFontSize = Convert.ToInt32(comboBoxFontSize.Text); 
    } 


    <ComboBox Grid.Column="1" Grid.Row="0" Height="21" Width="75" Name="comboBoxFontSize" HorizontalAlignment="Left" 
           VerticalAlignment="Center" DropDownClosed="comboBoxFontSize_DropDownClosed" 
           ItemsSource="{Binding Source={x:Static commands:ConstClass.ListOfFontSize},Mode=OneWay}" 
           SelectedItem="{Binding Source={x:Static static:DataGridClass.Instance},Path=DataGridFontSize, 
         Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 
+0

इस उदाहरण के लिए बहुत बहुत धन्यवाद, यह वही है जो मुझे चाहिए था। यह एक इलाज काम करता है! – RobHurd

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