2014-02-26 3 views
0

После этого 2010 статьи: MVVM: To Wrap or Not to Wrap?Упаковочный бизнес-модели

мне было интересно, если с тех пор она существует какой-то рамки или класс, чтобы помочь нам построить обертки вокруг объекта Model, который будет делать все сантехнические относительно свойств модели INotifyPropertyChanged и ObservableCollection в модели.

Я хочу создать пользовательский интерфейс и не иметь никакого контроля над моделью. Модель обновляет себя и свою различную ObservableCollection и имеет многочисленные иерархические уровни. Что-то вроде:

class A 
     | 
     some properties that implement INotify 
     ObservableCollection<Class B> 

class B 
     | 
     some properties that implement INotify 
     ObservableCollection<Class C> 

class C 
     | 
     etc... 

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

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

Большое спасибо.

+0

Существует, но вы не можете использовать его, потому что это зависит от внутренностей, что вы не можете получить доступ. Это ModelItem из WF4. Он используется в дизайнере для обертывания POCOs и поддержки поддержки уведомления об изменении свойств, событий изменения коллекции, отмены/повтора, прикрепленных свойств и т. Д. Если вы изучите, как это работает, вы можете создать свою собственную реализацию. – Will

+0

Я посмотрю. Спасибо. – user3091460

ответ

1

Вы можете сделать несколько вещей:

Используйте PostSharp для постобработки скомпилированного кода, чтобы изменить IL путем добавления необходимого кода. Плюсы: довольно легко. Минусы: номера строк в трассировке стека больше не соответствуют номерам строк в исходном коде. Лично я не использую его для этого.

Отсоедините его и напишите код.

Myself, я использую LinqPad со сценарием, как это:

void Main() 
{ 
    StringBuilder sb = new StringBuilder(); 
    string source = @"  public bool Passed { get; set; } 
     public string Name { get; set; } 
     public Type TestType { get; set; } 
     public Exception Exception { get; set; } 
     public TestStage StageFailed { get; set; } 
     public bool IncludeTest { get; set; }"; 
    string[] lines = source.Replace('\r', ' ').Split('\n'); 
    for (int i = 0; i < lines.Length; i++) 
    { 
     string prop = lines[i].Trim(); 
     string[] propBits = prop.Split(' '); 
     string type = propBits[1]; 
     string name = propBits[2]; 
     sb.Append("private " + type + " " + PascalCase(name) + ";\r\n"); 
     sb.Append("public " + type + " " + name + "\r\n"); 
     sb.Append("{\r\n"); 
     sb.Append("get { return this." + PascalCase(name) + "; }\r\n"); 
     sb.Append("set\r\n"); 
     sb.Append("{\r\n"); 
     sb.Append("if (this." + PascalCase(name) + " != value)\r\n"); 
     sb.Append("{\r\n"); 
     sb.Append("this." + PascalCase(name) + " = value;\r\n"); 
     sb.Append("RaisePropertyChanged(\"" + name + "\");\r\n"); 
     sb.Append("}\r\n"); 
     sb.Append("}\r\n");  
     sb.Append("}\r\n");  
    } 
    sb.ToString().Dump(); 
} 

private string PascalCase(string name) 
{ 
    return name.Substring(0, 1).ToLower() + name.Substring(1); 
} 

скопировать код, чтобы поместить биты Inotify в него: string source = @" и копию вывода из работы его обратно в исходный код. Работа выполнена.

LinqPad - очень, очень полезный инструмент.

+0

Yaknow ... если вы не выбрали все эти строки, номера строк по-прежнему будут совпадать ... – Will

+0

Они все равно совпадут, как я делаю это в источнике перед компиляцией. Это IL, который переплетает PostSharp, который меняет номера строк. Это не использует PostSharp. –

+0

Спасибо за это. Взглянув на PostSharp, кажется очень полезным, но я нашел эту тему на форуме, говоря, что она не поддерживает ObservableCollections: http://support.sharpcrafters.com/discussions/questions/246-observablecollection-best-practices – user3091460

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