Обязательный вопрос в WPF - Разница между свойствами и полями - PullRequest
4 голосов
/ 12 июня 2011

У меня есть вопрос о том, как работают привязки в WPF.

Если у меня есть view-модель с таким свойством:

private string testString;
public string TestString
{
    get { return testString; }
    set { testString = value; }
}

Тогда, если я связываю его с xaml с чем-токак это:

<TextBlock
    Text="{Binding Path=TestString, Mode=TwoWay}"
    Foreground="Red"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    FontFamily="Calibri"
    FontSize="24"
    FontWeight="Bold">
</TextBlock>

Это работает ... Ничего нового здесь.

Однако, если я удаляю геттеры и сеттеры из тестовой строки и получаю что-то вроде этого:

public string TestString;

Та же самая привязка не работает.Я понятия не имею, почему это происходит, потому что для меня это эквивалент публичного атрибута публичному атрибуту с пользовательским get и set.

Может ли кто-нибудь пролить свет на эту тему для меня?:)

TYVM заранее !!

PS: Извините за подсветку синтаксиса.Я просто не могу понять, как работать с блоком кода.

Ответы [ 3 ]

3 голосов
/ 12 июня 2011

Удаление метода получения и установки изменяет элемент TestString с свойства на поле.Вот почему привязка перестает работать, и, вероятно, это не то, что вы хотели сделать (такое открытое поле обычно считается плохим дизайном).

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

public string TestString { get; set; }
2 голосов
/ 12 июня 2011

@ Сильва, твоя догадка верна, что-то происходит за кулисами. Я ясно видел это только в одном сообщении в блоге, с которым я столкнулся в блоге Пита Брауна (Microsoft Developer Evangelist):

http://10rem.net/blog/2010/12/17/puff-the-magic-poco-binding-and-inotifypropertychanged-in-wpf

Ознакомьтесь с разделом, где он пишет о классе PropertyDescriptor. Он также продолжает упоминать, что он относительно неэффективен по сравнению с использованием более традиционного метода реализации интерфейса INotifyPropertyChanged в классе viewmodel, например:

private string testString;

public string TestString
{
    get { return testString; }
    set {
        if (testString != value) {
            testString = value;
            RaisePropertyChanged("TestString");
        }
    }
}

public event PropertyChangedEventHandler PropertyChanged;

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

Я был довольно удивлён, прочитав, что снижение производительности в 4 раза связано с отсутствием реализации интерфейса.

2 голосов
/ 12 июня 2011

Я не уверен, что это может быть связано с INotifyPropertyChanged, может быть после удаления Get Set WPF не сможет определить, был ли источник изменен или нет.Или оно рассматривается как свойство «Только для чтения».

Просим вас просмотреть эту статью

http://msdn.microsoft.com/en-us/library/ms752347.aspx

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...