2013-06-07 3 views
2

Я разрабатываю класс LogManager для обработки всех моих журналов в моем приложении в виде объектов LogMessage. Они сохраняются в классе ObservableCollection. Сам LogManager является статическим для доступа в каждой части моей программы.Уведомить ViewModel об изменении статической модели

Теперь я хочу сделать View, что может отображать ObservableCollection из LogMessages, но я не могу обернуть мою голову вокруг, как я мог уведомить ViewModel, что новый LogMessage был добавлен ...

Я попытался реализация INotifyPropertyChanged, но поскольку класс статический, это невозможно.

PS: Я использую инструментарий MVVM-Light для моего приложения

+1

Я уверен, что вы можете связывать статические свойства. AFAIK, '{Binding Source = {x: Static YourClass.Property ...' должен работать. Я помню, что я читал что-то подобное, когда играл с wpf, но не уверен. Btw – Leri

+1

Да, я был прав: http://stackoverflow.com/a/9500648/1283847 Это дубликат, кстати. – Leri

+0

@PLB: Это может сработать, однако я бы предпочел иметь коллекцию в моем «ViewModel», так как хочу сохранить ее в альтернативном «ObservableCollection», чтобы я мог очистить журналы в представлении, но не в «LogManager» ' – Kryptoxx

ответ

2

Вы должны рассмотреть обязанности вас LogManager. Нужно ли действительно реализовать INotifyPropertyChanged?

Вы можете использовать StaticResource в своем XAML для LogManager или предоставить ему его свойство в ViewModel View.

ViewModel:

//Placeholder class 
public static class LogManager 
{ 
    public static ObservableCollection<LogMessage> Messages { get; } 
} 

public class LogMessage 
{ 
    public string Text { get; set; } 
} 

public class LogManagerViewModel 
{ 
    public ObservableCollection<LogMessage> Messages { get { return LogManager.Messages; } } 
} 

XAML:

<ListBox ItemsSource="{Binding Messages}" DisplayMemberPath="Text" /> 

Это сказало мне было бы целесообразно рассмотреть возможность использования встроенных возможностей для инъекций зависимость от MvvmLight и сделать не статическим LogManager.

+0

Я делал то же самое, и я думал, что это не сработало, так как я ничего не видел в своем ListBox, тогда я прочитал ваш ответ, и я понимаю, что я не установил свойство DisplayMemberPath. Глупо мне! Спасибо, что заставило меня понять, что это может быть определенно слишком мне, чтобы узнать сам – Kryptoxx

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