Стратегия, государство, синглтон ... или их состав? - PullRequest
1 голос
/ 30 марта 2012

Я новичок в stackoverflow и относительно новый в WPF.

Я обернул голову вокруг полудюжины томов «Образцы и лучшие практики» (а также многочисленные посты здесь), но, похоже, не могу найти решение, которое ищу.

Моя проблема: WPF / .Net 4 / C # У меня есть текстовый процессор (типа Editor E ), который может загружать один документ (типа Document D ) за один раз (обозначается как Editor.CurrentDocument ) , Несколько элементов управления пользовательского интерфейса связываются со свойствами Document (все свойства зависимостей), такими как Document.Title , Document.DateLastModification .

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

Я попытался создать класс SingleInstanceDocument , который наследуется непосредственно от Document и использует шаблон Singleton. Но тогда я не могу найти способ вставить какой-либо экземпляр Document в SingleInstanceDocument без необходимости повторного сопоставления всех свойств.

Я как-то заблуждаюсь или здесь упускаю смысл? Если подход SingleInstanceDocument является жизнеспособным решением, могу ли я использовать отражение, чтобы автоматически переназначить все доступные свойства зависимостей из внутреннего документа во внешнюю оболочку SingleInstanceDocument?

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

Добавление

Оказалось, что требуемая здесь функциональность уже была предоставлена ​​WPF / .NET из коробки путем реализации INotifyPropertyChanged на хост-объекте CurrentDocument. Таким образом, изменение текущего документа привело к тому, что пользовательский интерфейс соответствующим образом обновил свои связанные элементы управления. Я прошу прощения за все замешательство.

1 Ответ

0 голосов
/ 30 апреля 2012

Во-первых, изучите базовый шаблон MVVM. В основном в WPF-MVVM просто используйте ObservableCollection и INotifyPropertyChanged интерфейс .

этот тип коллекции реализует шаблон наблюдателя, который уведомляет об обновлении пользовательского интерфейса (просмотр) при добавлении / удалении или "выборе" текущего элемента.

//in main ViewModel
private Ducument _currentDocument;

public Document CurrentDocument 
{ 
    get { return _currentDocument; }
    set
    {
        _currentDocument = value;
        NotifyPropertyChanged("CurrentDocument");
    }
}

//stored all loaded documents as collection.
public ObservableCollection<Document> Documents { get; set; } 

привязка выбрана - текущий элемент.

<ListBox ItemsSource="{Binding Path=Documents}" SelectedItem="{Binding Path=CurrentDocument}" DisplayMemberPath="Title">
    <!-- //all Document.Title as listitem -->
</ListBox>
<!--// Editor's View -->
<ContentControl DataContext="{Binding Path=CurrentDocument}"></ContentControl>
...