2009-09-23 23 views
10

CAL/Prism kullanarak bir bileşik uygulama yapıyorum. Ana bölge, birden çok görünüm türüne sahip sekme kontrolüdür. Her görünümde, pencerenin üst kısmındaki araç çubuğu düğmelerine bağlı olarak kullanabileceği özel bir ayar komutları vardır. Bunu daha önce CAL uygulamalarında komut üzerinde InputBinding'i ayarlayarak yaptım, ancak CAL modülleri için kaynak kodunda böyle bir mekanizma bulamadım.Bir tuşa basma, Bileşik WPF'de bir DelegateCommand ile nasıl ilişkilendirilir?

Sorum, benim görünümüne bir tuş kanca iyi yolu, ne Kullanıcı ALT + T, ilişkili DelegateCommand nesne onu kolları bastığında böylece? Bir kısayolu ayırmak zor olabilir ...

+0

J, Silverlight'ta Dondurulabilir bulamıyorum, neyi özlüyorum? – kenny

cevap

14

MVVM Toolkit, CommandReference adlı bir sınıfa sahiptir ve bu, bir tuşa basma olarak bir komut referansı kullanmanıza olanak tanır.

Bunu yapacaktır.

Düzeltme: Bu yazıldığından beri, WPF 4.0 bu özel sorunu giderdi ve artık statik kaynak geçici çözümünü kullanmak zorunda değilsiniz. Viewmodelinizdeki komutu doğrudan KeyBinding'den referans alabilirsiniz.

+0

Mükemmel! CommandReference sınıfını bulmak için harcadığımdan daha fazla zamanımı aldım. Anahtar kelimenin tam anlamıyla iki dakikada çalışmasını sağlamıştım. Bir ton teşekkürler. – JMcDaniel

+0

Sanırım her iki cevap da birleştirilmeli, tam cevap aslında ikisidir (bu ve JMcDaniel's). Biri diğeri olmadan tamamlanmamıştır. Sorunu çözmek için ikisine de ihtiyacım vardı. Teşekkürler! – bluediapente

17

Sadece başvuru için, CommandReference sınıf anda başvurabileceğiniz bir montaj dahil değildir, ancak M-V-VM proje şablonu ile dahildir. Yani, uygulamanızı şablondan oluşturmazsanız, sınıfı başka bir yerden almanız gerekir. Bunu örnek projeden kopyalamayı seçtim. Herkesin bu küçük iyilik yığınına kolay erişime izin vermek için aşağıda yer aldım, ancak M-V-VM Araç Takımı'nın gelecekteki sürümlerinde şablondaki güncellemeleri kontrol ettiğinizden emin olun.

/// <summary> 
/// This class facilitates associating a key binding in XAML markup to a command 
/// defined in a View Model by exposing a Command dependency property. 
/// The class derives from Freezable to work around a limitation in WPF when data-binding from XAML. 
/// </summary> 
public class CommandReference : Freezable, ICommand 
{ 
    public CommandReference() 
    { 
    } 
    public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged))); 

    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    #region ICommand Members 

    public bool CanExecute(object parameter) 
    { 
     if (Command != null) 
      return Command.CanExecute(parameter); 
     return false; 
    } 

    public void Execute(object parameter) 
    { 
     Command.Execute(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 

    private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     CommandReference commandReference = d as CommandReference; 
     if (commandReference != null) 
     { 
      ICommand oldCommand = e.OldValue as ICommand; 
      if (oldCommand != null) 
       oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged; 

      ICommand newCommand = e.NewValue as ICommand; 
      if (newCommand != null) 
       newCommand.CanExecuteChanged += commandReference.CanExecuteChanged; 
     } 
    } 

    #endregion 

    #region Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new CommandReference(); 
    } 

    #endregion 
} 

+1

Hey teşekkürler, bu gelecek olan için iyi olacak. –

+0

Kodu gönderdiğiniz için teşekkürler! Görünüşe göre, "gelecek adam" bu kodu arıyordu ... :) – gehho

+0

Silverlight'ta Dondurulabilir bulamıyorum, neyi özlüyorum? – kenny

0

bu makalelere göz atın: http://coderscouch.com/tags/input%20bindings. Yararlı olmalılar.

+1

Lütfen buna bir göz atın: http://stackoverflow.com/questions/how-to-answer Lütfen bir bağlantıyı yanıt olarak belirtmeyin. Sorunun nasıl çözüleceğini açıklayın. –

+0

Bağlantı bozuk, ... – ergohack

İlgili konular