Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Попробуйте это 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

Ответ Саймона - это решение, но вот мой код и скриншот для справки. Я использую 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.

Ответ 4

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

Связывание данных без INotifyPropertyChanged

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

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

Ответ 5

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

Он также работает с Rules Engine из коробки, чтобы дать вам подтверждение. Поскольку он является расширяемым, можно использовать другие Framework Validation.

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