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

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • newport83

    newport83

    19 HAZİRAN 2006
  • Rockstar Games

    Rockstar Gam

    17 ŞUBAT 2006