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

  • Absolute Zero(Programming Tutorials)

    Absolute Zer

    22 Kasım 2012
  • DudeFromUkraine

    DudeFromUkra

    7 Ocak 2008
  • Willie D.

    Willie D.

    16 Aralık 2006