Tak, zrobiłem to i działa z powodzeniem dla mojej aplikacji biznesowej. Zmodyfikowałem plik Model.tt tak, aby miał wirtualną ObservableCollection<T>
zamiast ICollection<T>
i zastąpił ją HashSet<T>
.
Ja również realizowany INotifyPropertyChanged
na podmioty z następującym realizacji:
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Musiałem zawierać trzy dodatkowe za pomocą instrukcji:
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Collections.ObjectModel;
Jest to funkcja, że zmieniła się w CodeStringGenerator do Zaimplementuj moje moduły pobierające i ustawiające: (Niestety, nadal nie otrzymałem tego, aby było bardziej czytelne)
public string Property(EdmProperty edmProperty)
{
var fourSpaces = " ";
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1} _{2};{3}{4}{0} {1} {2}{3}{4}{{{3}{4}{4}{5}get {{ return _{2}; }} {3}{4}{4}{6}set{3}{4}{4}{{{3}{4}{4}{4}if (value == _{2}) return;{3}{4}{4}{4}_{2} = value;{3}{4}{4}{4}NotifyPropertyChanged();{3}{4}{4}}}{3}{4}}}{3}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
_code.Escape(edmProperty),
Environment.NewLine,
fourSpaces,
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
A to próbka pełny wygenerowany plik jednostka dla odniesienia:
namespace Eagl.Eagle.Data
{
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Collections.Generic;
using System.Collections.ObjectModel;
public partial class Game : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public Game()
{
this.Playtests = new ObservableCollection<Playtest>();
}
public int _Id;
public int Id
{
get { return _Id; }
set
{
if (value == _Id) return;
_Id = value;
NotifyPropertyChanged();
}
}
public string _Name;
public string Name
{
get { return _Name; }
set
{
if (value == _Name) return;
_Name = value;
NotifyPropertyChanged();
}
}
public virtual ObservableCollection<Playtest> Playtests { get; set; }
}
}
Hmmm ... prawo. Myślę też, że przez ostatnie kilka godzin szczekałem złe drzewo. Mam długo działający kontekst EF (ze względu na powiązanie MVVM), dlatego wywołałem SaveChanges() w kontekście w moim destruktorze adapterów danych, aby upewnić się, że zmiany zostały zachowane. Okazuje się, że [nie można tego zrobić] (http://stackoverflow.com/questions/7105529/handle-is-not-initialized-error/11695464#11695464). Tak więc moje obawy związane z obserwowalnością mogły być czerwonym śledziem. – Bob