Как я могу добавить свойство IsDirty в объект LINQ to SQL?

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

Вот очень простой пример, демонстрирующий то, о чем я говорю (простите за ошибки):

<Page ...>
    <Page.DataContext>
        <vm:MyPageViewModel /> <!-- Holds reference to the DataContext -->
    </Page.DataContext>
    <ItemsControl
        ItemsSource = {Binding Items}>
        <ItemsControl.Resources>
            <DataTemplate
                DataType="Lol.Models.Item"> <!-- Item is L2S entity -->
                <!-- In real life, I use styles to set the background color -->
                <TextBlock Text="{Binding IsDirty, StringFormat='Am I dirty? /{0/}'}"/>
            </DataTemplate>
        </ItemsControl.Resources>
    </ItemsControl>
</Page>

В примере просто напечатано «Я грязный? Да» или «Я грязный? Нет», но идею вы поняли.

Для этого мне нужно добавить общедоступное свойство к моему Item (частичный класс, простой) , которое может определять, является ли объект грязным или нет. Это сложный момент.

public partial class Item
{
    public bool IsDirty
    {
        get
        {
            throw new NotImplementedException("hurf durf");
        }
    }
}

Вне сущности это довольно просто (если у вас есть DataContext, к которому сущность прикреплена). Внутри не так уж и много.

Какие у меня здесь варианты?


Изменить: я не думаю, что здесь есть одно хорошее решение, поэтому приветствуются предложения по обходным путям.

(Хорошо, существуют аналогичные вопросы, но все они о том, как определить это вне самой сущности и использовать DataContext, к которому сущность прикреплена.)


person Community    schedule 12.07.2009    source источник
comment
Он не сделает этого за вас, но нет никаких причин, по которым вы не можете реализовать всю логику для отслеживания исходных значений и синхронизации объекта. С большой моделью это может быть утомительно, но должно работать.   -  person Donald Byrd    schedule 19.10.2009
comment
Да, это сработает, но это также будет очень утомительно. То же самое и с другим вариантом, когда вы просматриваете ожидающие изменения в DataContext. Но поскольку L2S не ссылается на свой DataContext, вы должны встроить это (вероятно, не очень хорошая идея) или вам нужно изучить объект извне ...   -  person    schedule 19.10.2009


Ответы (1)


Если вы используете классы, сгенерированные dbml, вы сможете реализовать несколько таких частичных методов:

public partial class SampleEntity
{
    partial void OnCreated()
    {
        this.IsDirty = true;
    }

    partial void OnLoaded()
    {
        this.PropertyChanged += (s, e) => this.IsDirty = true;
        this.IsDirty = false;
    }

    public bool IsDirty { get; private set; }
}
person Donald Byrd    schedule 13.07.2009
comment
Использование лямбды здесь - чистое зло. Мне это нравится. - person Dave Markle; 13.07.2009
comment
Я рассматривал что-то подобное, но это не учитывает исходное состояние объекта. Так что, я считаю, возможны ложные грязи. Как это предотвратить? - person ; 13.07.2009
comment
Я не понимаю, что вы имеете в виду, вы могли бы привести мне пример? - person Donald Byrd; 13.07.2009
comment
Ложные неприятности могут произойти, если свойство было изменено, а затем возвращено к исходному значению. в событии Property Changed невозможно определить, отличается ли значение отправителя от исходного значения (я пробовал использовать отражение), и мне не повезло с событием PropertyChanging (поскольку linq2Sql не отправляет имя свойства) - person AlignedDev; 18.09.2009
comment
@klogan - то, что вы ищете, - это нечто большее, чем генерация кода dbml для вас. В итоге я создал свой собственный инструмент для генерации кода linq2sql, чтобы добавить функции, которые я хотел, изменить имя ссылочного свойства и исправить события при изменении, чтобы вы знали, какое свойство менялось. Чтобы отслеживать исходные значения, вам придется отредактировать или создать подкласс классов dbml или создать собственный код. Вы вместо этого изучали структуру сущностей? - person Donald Byrd; 18.09.2009
comment
Принятие в качестве ответа; нет хорошего решения, если вы не сделаете то, что сделал @ongle. - person ; 20.07.2010