2010-11-30 2 views
0

У меня есть ListView, привязанный к объекту LINQ to SQL. Когда я дважды кликаю статью в ListView, она открывает окно сведений о статье и позволяет пользователю изменять свойства статьи.Проблема обновления привязки LINQ

Пока все работает нормально, но когда пользователь сохраняет и закрывает детали статьи, ListView не отражает внесенные изменения (например, описание статьи). Я не хочу реализовывать INotifyPropertyChanged во всех моих классах LINQ, потому что я использую VS2010 для генерации моей таблицы таблиц Linq, поэтому было бы болью изменять автоматически сгенерированный код разработчика ... (и это, безусловно, будет отменять все мои изменения каждый раз Я внесу изменения в схему таблицы)

Как я могу просто заставить ListView обновить привязку LINQ, когда окно сведений закрыто?

Заранее благодарим за помощь.

ответ

1

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

+0

Я не заметил, что ^^ Спасибо – Karnalta

1

Быстрое и простое решение заключается в использовании DynamicObject декоратора, чтобы добавить поведение notificcation изменения без необходимости изменять исходные классы, или написав набор частичных определений классов

public class DynamicBindingProxy<T> : DynamicObject, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private static readonly Dictionary<string, Dictionary<string, 
     PropertyInfo>> properties = new Dictionary<string, 
      Dictionary<string, PropertyInfo>>(); 
    private readonly T instance; 
    private readonly string typeName; 

    public DynamicBindingProxy(T instance) 
    { 
     this.instance = instance; 
     var type = typeof(T); 
     typeName = type.FullName; 
     if (!properties.ContainsKey(typeName)) 
      SetProperties(type, typeName); 
    } 

    private static void SetProperties(Type type, string typeName) 
    { 
     var props = type.GetProperties(
      BindingFlags.Public | BindingFlags.Instance); 
     var dict = props.ToDictionary(prop => prop.Name); 
     properties.Add(typeName, dict); 
    } 

    public override bool TryGetMember(GetMemberBinder binder, 
     out object result) 
    { 
     if (properties[typeName].ContainsKey(binder.Name)) 
     { 
      result = properties[typeName][binder.Name] 
       .GetValue(instance, null); 
      return true; 
     } 
     result = null; 
     return false; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, 
     object value) 
    { 
     if (properties[typeName].ContainsKey(binder.Name)) 
     { 
      properties[typeName][binder.Name] 
       .SetValue(instance, value, null); 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(binder.Name)); 
      return true; 
     } 
     return false; 
    } 
} 

и Heres образца Useage:

public partial class MainWindow : Window 
{ 
    private readonly TestObj tObj; 
    private DynamicBindingProxy<TestObj> dynObj; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     tObj = new TestObj() { Name = "test", Amount = 123.45, ID = 44, SomeDate = DateTime.Now }; 
     dynObj = new DynamicBindingProxy<TestObj>(tObj); 
     DataContext = dynObj; 
    } 

    private void UpdateName(object sender, RoutedEventArgs e) 
    { 
     ((dynamic)dynObj).Name = newText.Text; 
    } 
} 

полную информацию можно найти на блоге я написал специально об этом вопросы http://www.deanchalk.me.uk/post/WPF-e28093-Easy-INotifyPropertyChanged-Via-DynamicObject-Proxy.aspx

Смежные вопросы