INotifyPropertyChanged для статической переменной - PullRequest
6 голосов
/ 20 марта 2012

У меня была переменная, которая не была статичной, и INotifyPropertyChanged успешно реализован. Затем я попытался сделать его глобальным, поэтому превратил его в статическую переменную. Но на этот раз INotifyPropertyChanged не работает. Любое решение?

Ответы [ 2 ]

23 голосов
/ 20 марта 2012

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;
6 голосов
/ 04 апреля 2012

Очень хороший пример, я использовал его для некоторых общих настроек в приложении, когда я хочу связать какое-либо свойство в сети с компонентами

    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)

Bindэто к свойствам компонентов

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>

Когда вы изменяете это значение где-то в приложении, например, «Предпочтения» -> DataGrid FontSize - для него автоматически обновляется это свойство для привязок с UpdateSourceTrigger

    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}"/>
...