2009-07-12 54 views
2

我将我的实体绑定到WPF中的编辑表单。在DataTemplate中,我希望能够在DataTemplate中设置根容器的背景颜色,以显示它已被更改,并且这些更改尚未提交到数据库。如何添加一个“IsDirty”属性到LINQ to SQL实体?

这里是一个非常简单的示例,演示了什么我谈论(原谅的错误):

<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> 

的例子只是打印出“?我脏是”或“我是肮脏的没有?”但你明白了。

要做到这一点,我需要一个公共属性添加到我的项目(局部类,简单)可以确定如果对象是脏还是不。这是艰难的一点。

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

以外的实体,它很简单(只要你有的DataContext实体连接到)。里面,不是很多。

我在这里有什么选择?


编辑:我不认为有一个很好的解决方案在这里,所以解决方法建议,欢迎。

(好吧,类似的问题存在,但它们都是关于如何从确定此之外的实体本身的并使用的DataContext实体连接到。)

+0

它不会为你做,但没有任何理由你不能实现所有的逻辑来跟踪原始值并保持实体同步。使用大型模型可能会很乏味,但它应该可以工作。 – ongle 2009-10-19 13:50:17

+0

是的,它会工作,但它也会非常乏味。另一种选择是在DataContext中处理未完成的更改。但是由于L2S没有引用它的DataContext,所以你必须建立它(可能不是一个好主意),或者你必须从外部检查实体... – Will 2009-10-19 14:08:21

回答

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; } 
}