Самый простой способ добиться автоматического уведомления об изменении свойства - PullRequest
28 голосов
/ 17 января 2011

Я знаю, что существуют решения для реализации INotifyPropertyChanged, но ни одно из них не так просто, как: ссылка на эту библиотеку, создание / добавление этого атрибута, готово (я думаю, что Аспектно-ориентированное программирование здесь).Кто-нибудь знает действительно простой способ сделать это?Бонусные баллы, если решение бесплатное.

Вот некоторые соответствующие ссылки (ни одна из которых не дает достаточно простого ответа):

Ответы [ 6 ]

30 голосов
/ 17 января 2011

Попробуйте это https://github.com/Fody/PropertyChanged

Это будет сплетать все свойства типов, которые реализуют INotifyPropertyChanged и даже обрабатывает зависимости.

Ваш код

public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string GivenNames { get; set; }
    public string FamilyName { get; set; }

    public string FullName
    {
        get
        {
            return string.Format("{0} {1}", GivenNames, FamilyName);
        }
    }

}

Что компилируется

public class Person : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private string givenNames;
    public string GivenNames
    {
        get { return givenNames; }
        set
        {
            if (value != givenNames)
            {
                givenNames = value;
                OnPropertyChanged("GivenNames");
                OnPropertyChanged("FullName");
            }
        }
    }

    private string familyName;
    public string FamilyName
    {
        get { return familyName; }
        set 
        {
            if (value != familyName)
            {
                familyName = value;
                OnPropertyChanged("FamilyName");
                OnPropertyChanged("FullName");
            }
        }
    }

    public string FullName
    {
        get
        {
            return string.Format("{0} {1}", GivenNames, FamilyName);
        }
    }    

    public void OnPropertyChanged(string propertyName)
    {
        var propertyChanged = PropertyChanged;
        if (propertyChanged != null)
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));    
        }
    }
}

Или вы можете использовать атрибуты для более детального контроля.

3 голосов
/ 18 января 2011

Ответ Саймона - это решение, но вот мой код и скриншот для справки. Я использую Prism (с MEF - игнорировать атрибуты класса), поэтому я наследую от NotificationObject для INotifyPropertyChanged. (Он определяет метод RaisePropertyChanged, поэтому вы должны указать NotifyPropertyWeaver в файле проекта.)

Класс

using System.ComponentModel.Composition;
using Microsoft.Practices.Prism.ViewModel;

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class SignControllerViewModel : NotificationObject
{
    public string Uri { get; set; }
}

Файл проекта

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- snipped -->
    <UsingTask TaskName="NotifyPropertyWeaverMsBuildTask.WeavingTask" AssemblyFile="$(SolutionDir)lib\NotifyPropertyWeaverMsBuildTask.dll" />
    <Target Name="AfterBuild">
        <NotifyPropertyWeaverMsBuildTask.WeavingTask
                    TargetPath="$(TargetPath)"
                    TryToWeaveAllTypes="true"
                    EventInvokerName="RaisePropertyChanged"
                    MessageImportance="High"/>
    </Target>
</Project>

Код рефлектора

Code after INPC has been weaved into it.

3 голосов
/ 17 января 2011

Вот статья, показывающая , как это сделать с помощью PostSharp .

2 голосов
/ 24 июля 2012

Существует проект под названием Polymod . Который предлагает то, что вы ищете. Он имеет некоторые интересные функции, такие как определение формул самообновления. Например. Если Sum = A + B, то PropertyChanged вызывается для Sum при изменении A или B.

Он также работает с Механизмом правил"из коробки", чтобы предоставить вам проверку. Поскольку он расширяемый, можно использовать и другие фреймворки валидации.

Аспектно-ориентированное программирование в лучшем виде!

2 голосов
/ 09 февраля 2011

Существует также UpdateControls.NET . Я не использовал его, и это выглядит как большая работа, чем notifypropertyweaver, но это может быть хорошо. С сайта:

Привязка данных без INotifyPropertyChanged

Update Controls не требует, чтобы вы реализовали INotifyPropertyChanged или объявили DependencyProperty. Он подключает элементы управления напрямую к свойствам CLR. Он обнаруживает зависимости от данных через слои промежуточного кода. Это делает его идеальным для шаблона Model / View / ViewModel; дополнительный код не требуется во ViewModel, который находится между моделью и представлением.

Оберните DataContext вашего окна. Оболочка не только реализует INotifyPropertyChanged для всех свойств вашего объекта, но также автоматически определяет их зависимости от других свойств. Нет базового класса или интерфейса для реализации.

1 голос
/ 06 апреля 2018

Существует также KindOfMagic, который очень прост в использовании.Просто создайте атрибут Magic и примените его.https://www.nuget.org/packages/KindOfMagic

...