0

我认为这很简单,但找不到任何好的例子。

public Class BookVm : ImplementsPropertyChanged
{
    public int BookId {get;set;}
    private bool _favorite;
    public bool Favorite
    { 
        get { return _favorite; }
        set {
                _favorite = value;
                OnPropertyChanged("Favorite");
               MyDbContext.SaveChanges() // this does not work
        }
    }

然后在我的 XAML 中绑定到Book

<CheckBox Content="Favorite" IsChecked="{Binding Favorite}" />

如何以及何时在我的 DatabaseContext 上调用 SaveChanges()?

我不想实现保存按钮。如果我拦截 PropertyChange 事件并调用 SaveChanges,似乎什么都没有发生。我的对象在内存中被修改,但数据库没有看到变化。

我的BookVm课程是在应用程序启动时创建的,如下所示:

        foreach (var book in MyDbContext.Books)
            Books.Add(book);

在我Books的哪里ObservableCollection<Book>MainWindowVm

4

3 回答 3

1

假设您有一个返回书籍并更新书籍的数据服务类:

 public class DataService
{
    public static void UpdateBook(Book book)
    {
        //Call the context to update the database
    }

    public static IEnumerable<Book> FetchBooks()
    {
        // return DBContext.GetBooks
    }
}

现在您可以制作一个视图模型,它需要一本书,然后返回属性。BookId 不会根据数据库更改(如果它是主键)。

//Domain Object
public class Book
{
    public int BookId { get; set; }
    public bool Favourite { get; set; }
}

//View Model
public class BookVm : ImplementsPropertyChanged
{
    private readonly Book book;

    //Store the book
    public BookVm(Book book)
    {
        this.book = book;
    }

    private bool favorite;
    public int BookId
    {
        get { return book.BookId; }
    }

    public bool Favorite
    {
        get { return favorite; }
        set
        {
            if (favorite != value)
            {
                favorite = value;
                //Update the database 
                UpdateDatabase();
            }
        }
    }

    private void UpdateDatabase()
    {
        //set the favorite value of the domain book
        book.Favourite = favorite;
        DataService.UpdateBook(book);
    }
}

我们将域对象存储在 ViewModel 中以供以后用户使用。我们还可以编写一个控制器来显示如下视图:

public class BookController
{
    public void Display()
    {
        IEnumerable<Book> books = DataService.FetchBooks();
        ObservableCollection<BookVm> bookVms = new ObservableCollection<BookVm>();
        foreach (var book in books)
        {
            BookVm bookVm = new BookVm(book);
            bookVms.Add(bookVm);
        }
        //Get the View and then bind using the bookVms collection
    }
}
于 2014-06-08T15:22:57.797 回答
0

如果要保存属性的更改,则Favorite必须订阅属性更改事件,然后将值保存到数据库。

在这里您可以找到一个链接,其中包含有关订阅属性更改事件的信息

编辑 是来自 MSDN 的示例

于 2014-06-08T15:17:09.013 回答
0

还猜测您在 Implements 属性更改中有类似的代码。

public class ImplementsPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
} 

您还需要添加以下内容以引发通知。

public bool Favorite
    {
        get { return favorite; }
        set
        {
            if (favorite != value)
            {
                favorite = value;
                //Update the database 
                UpdateDatabase();
                OnPropertyChanged("Favorite");
            }
        }
    }
于 2014-06-08T15:32:26.073 回答