2013-08-19 5 views
0

Если у меня есть класс, как так:Когда использовать общественную или частную собственность?

public class MyClass:INotifyPropertyChanged 
{ 
private Visibility isVisible; 
private ObservableCollection<string> names; 

public Visibility IsVisible 
{ 
get{ return isVisible;} 
set { isVisible = value; OnPropertyChanged("IsVisible");} 
} 

public ObservableCollection<string> Names 
{ 
get { return names;} 
set { names = value; OnPropertyChanged("Names");} 
} 

//ctor 
public MyClass(){ 
    names = new ObservableCollection<string>(); 
} 


//INotifyPropertyChanged implementation 
public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

} 

Перед любой из обезглавит меня - я сделал совсем немного того, чтобы искать и нашел смешанный мешок ответов ...

  1. Могу ли я изменить свойства/переменные public или private для использования в моих привязках? то есть у меня проблема, когда добавление в names коллекции вызовет OnPropertyChanged, а изменение isVisible НЕ запускает OnPropertyChanged. Мое предположение состоит в том, что это происходит потому, что names является ObservableCollection где, как isVisible не но я не уверен ...

  2. Если я должен использует public свойства - что потребность в наличии в частных?

+1

Вы знакомы с «уровнем доступа». Я бы предложил прочитать «Свойства и уровень доступа» – MethodMan

ответ

4

Вам не нужно частной собственности, только частное поле будет достаточно, чтобы заменить:

private Visibility isVisible {get; set;} 

с

private Visibility isVisible; 

Если я должен использует публичные объекты - в чем нуждаются с частными?

Вы не можете использовать Авто-свойства с помощью функции INotifyPropertyChanged. Вот почему вам требуется резервное поле для вашей недвижимости IsVisible.

См: An elegant way to implement INotifyPropertyChanged

+0

, но должен ли я устанавливать 'IsVisible' или' isVisible'? – jharr100

+0

@ jharr100, установите 'isVisisble' в свой набор свойств, иначе он будет рекурсивным и приведет к исключению Stackoverflow. – Habib

+0

@Downvoter, был бы рад, если бы вы могли указать на ошибку – Habib

1

Так что я думаю, что вы путаете свойства и поля (ака переменных).

public class Example() 
{ 

    public int FieldExample; 

    private int _propertyExample; 

    public int PropertyExample 
    { 
     get 
     { 
      return _propertyExample; 
     } 
     set 
     { 
      _propertyExample = value; 
     } 
    } 
} 

В простых сценариях использования разница между полем и свойством не очевидна. Но свойства имеют различную сантехнику под капотом, что позволяет им использовать отражение и привязку. Для WPF это означает, что вы должны иметь общедоступные свойства. Лучшая практика для публичного имущества связана с частным (или защищенным) полем - и это имя поля обычно либо префикс с _, либо/или начинается с символа нижнего регистра. Это называется «опорным полем».

В частном поле поддержки хранятся фактические данные, общедоступное свойство - это просто средство, с помощью которого другие классы могут взаимодействовать с этими данными. Внутри блоков get и set вы можете поместить любой код, который хотите: вместо того, чтобы возвращать мое фоновое поле, я мог бы вместо этого поставить: return 5;. Это не полезно, и это плохая практика, но я могу. Как правило, код, который находится в ваших блоках get и set, должен по-прежнему устанавливать или получать значение; хотя сначала вы можете проверить ввод и/или форматировать его первым. Шаблон, который вы реализуете в своих наборах для WPF, вызывает событие, которое изменило свойство. Другие части вашей программы прослушивают это событие, чтобы знать, как обновить интерфейс.

Так что в вашем коде, если вы изменяете только поле поддержки и не создаете событие, произошедшее с изменением, пользовательский интерфейс не будет обновляться.Вы можете захотеть этого поведения, если выполняете сложное действие над объектом, и хотите приостановить выполнение обновления пользовательского интерфейса до тех пор, пока не будет завершена полная партия элементов, но это оптимизация, и для начала вам, вероятно, лучше всего будет доступ к/настройке к публичной собственности.

Смежные вопросы