Вопрос по binding, dirty-data, wpf, linq-to-sql – Как добавить свойство «IsDirty» в сущность LINQ to SQL?

2

Я связываю свои сущности с формой редактирования в 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>

Пример просто распечатывает "Я грязный?" да & Quot; или "Я грязный?" нет, но вы поняли.

Для этого мне нужно добавить публичную собственность в мойItem (частичный класс, простой)that can determine if the entity is dirty or not, Это сложный момент.

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

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

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

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

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

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

Ваш Ответ

1   ответ
5

Если вы используете сгенерированные 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; }
}
Я рассматривал что-то подобное, но это не учитывает исходное состояние объекта. Так что ложные грязи возможны, я верю. Какой хороший способ предотвратить это? Will
Ложные загрязнения могут произойти, если свойство будет изменено, а затем вернется к исходному значению. в событии «Изменено свойство» невозможно определить, отличается ли значение отправителя от исходного значения (я пытался использовать отражение), и мне не повезло с событием PropertyChanging (поскольку linq2Sql не отправляет название объекта)
Я не понимаю, что вы имеете в виду, не могли бы вы привести пример?
@klogan - то, что вы ищете, - это больше, чем просто делает для вас ген dbml кода. Я закончил тем, что создал свой собственный инструмент генерации кода linq2sql, чтобы добавить нужные функции, изменить именование ссылочного свойства и исправить события on change, чтобы вы знали, какое свойство менялось. Чтобы отслеживать исходные значения, вам нужно отредактировать или создать подклассы классов dbml или создать собственный код. Вместо этого вы изучили структуру сущностей?
Использование лямбды здесь - чистое зло. Мне это нравится.

Похожие вопросы