2014-11-01 2 views
0

Есть ли способ связать свойство виртуальной машины с любым свойством singleton (свойство статического ресурса, свойство в службе singleton ...) таким образом, что нам не нужно использовать IMessenger или обрабатывать SingletonServiceResolved OnPropertyChanged?Связывание с одноэлементным свойством

Мне кажется, что я грязный для меня (даже если он находится в базовом классе), чтобы каждое действие обрабатывало изменения в моем одноименном Clock Property.

public class ClockService : ObservableObject, IClockService { 
    private DateTime _clock; 
    public DateTime Clock { 
     get{ return _clock;} 
     set { _clock = value; RaisePropertyChanged("Clock"); } 
    } 
} 

public class SomeViewModel : BaseViewModel { 
    private IClockService _clockService; 
    private IMvxMessenger _messenger; 

    public SomeViewModel(IClockService clockService, IMvxMessenger messenger) { 
     _clockService=clockService; 
     _messenger = messenger; 

     //trying to avoid 
     clockService.PropertyChanged += OnClockServicePropertyChanged; 

    } 

    public DateTime MyClock { 
     get{return _clockService.Clock;} 
    } 

    private OnClockServicePropertyChanged(...) { 
     if(e.PropertyName=="Clock") RaisePropertyChanged("Clock"); 
    } 
} 

ответ

0

Один из способов связывания с одноточечным, чтобы выставить одноплодный через свойство на ваш ViewModel:

public Thing MySingleton 
{ 
    get 
    { 
     return Thing.Instance; 
    } 
} 

Update после комментария, что синглтон не является постоянная:

Вы можете использовать другой постоянный синглтон в качестве держателя - и тогда он может реализовать INotifyPropertyChanged - например:

public class ThingHolder : MvxNotifyPropertyChanged 
{ 
    public static readonly ThingHolder Instance = new ThingHolder(); 

    private Thing _thing; 
    public Thing CurrentThing 
    { 
     get { return _thing; } 
     set { _thing = value; RaisePropertyChanged(() => CurrentThing); } 
    } 
} 

Ваш ВМ может тогда такие свойства, как:

public ThingHolder ThingHolder 
{ 
    get 
    { 
     return ThingHolder.Instance; 
    } 
} 

Ваше мнение может затем привязать к выражениям, как ThingHolder.CurrentThing

+0

Проблема с этим решением является то, что UI никогда не будет PropertyChanged ... так что не будет обновить. Я спрашиваю, есть ли какой-то способ под капотом, который поможет мне избежать обработки EventSubscription (или messageSubscription) – ozapa

+0

Отредактировано после вашего комментария - но на самом деле я был бы осторожен в отношении использования термина «Синглтон» здесь, поскольку я думаю, что это может запутать другие - «Синглтон» довольно широко понимается как «только один экземпляр когда-либо создан» - например см. http://en.wikipedia.org/wiki/Singleton_pattern - обычно не понимают, что есть «текущий» экземпляр (по моему опыту). – Stuart

+0

Я не указал, но IClockService (в этом примере) во время инициализации разрешен как singleton by CreatableTypes(). EndingWith («Сервис»). AsInterfaces(). RegisterAsSingleton(); поэтому есть только один экземпляр ClockService и свойство Clock. Я что-то упускаю? – ozapa