SORU
1 Mart 2010, PAZARTESİ


Nasıl ViewModel için UI Memuru geçirmek için

Bu ViewModel geçmek istiyorum Görünümüne ait Dispatcher erişim hakkı olması gerekiyor. Ama Görünümü ViewModel, nasıl geçer misiniz? hakkında bir şey bilmesi gerekmiyor Bir arabirim veya örnekleri geçirmeden yerine Görünüm tarafından yazılacak küresel dağıtıcı bir tek oluşturmak tanıtmak? Nasıl MVVM uygulamalar ve Çerçeveleri bu çözersin?

EDİT: benim ViewModels arka plan iş parçacığı oluşturulan olabilir bu yana sadece ViewModel kurucu Dispatcher.Current yapamam Unutmayın.

CEVAP
1 Mart 2010, PAZARTESİ


Dağıtıcı bir arabirim kullanarak soyutlanmış varİContext:

public interface IContext
{
   bool IsSynchronized { get; }
   void Invoke(Action action);
   void BeginInvoke(Action action);
}

Bu birim test ViewModels daha kolay bir avantaja sahiptir.< / ^ br . Benim ViewModels içine arabirimi MEF (Kullanildigini Çerçevesinde Yönetilen) kullanarak enjekte edin. Başka bir ihtimal daha yapıcı bir argüman olabilirdi. Ancak, enjeksiyon MEF fazla kullanmayı seviyorum.

Güncelleme (yorum pastebin linki örnek):

public sealed class WpfContext : IContext
{
    private readonly Dispatcher _dispatcher;

    public bool IsSynchronized
    {
        get
        {
            return this._dispatcher.Thread == Thread.CurrentThread;
        }
    }

    public WpfContext() : this(Dispatcher.CurrentDispatcher)
    {
    }

    public WpfContext(Dispatcher dispatcher)
    {
        Debug.Assert(dispatcher != null);

        this._dispatcher = dispatcher;
    }

    public void Invoke(Action action)
    {
        Debug.Assert(action != null);

        this._dispatcher.Invoke(action);
    }

    public void BeginInvoke(Action action)
    {
        Debug.Assert(action != null);

        this._dispatcher.BeginInvoke(action);
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LevelUpTuts

    LevelUpTuts

    20 Ocak 2012
  • Need for Speed

    Need for Spe

    8 ŞUBAT 2006
  • Tire Rack

    Tire Rack

    31 Mayıs 2007