2009-11-17 16 views
6

Ben treeview öğesi için bir şablon var.WPF CommandParameter bağlayıcı ve CanExecute

sorun: I CanExecutedMethod ile DelegateCommand 'Ekle kullanabilirsiniz edin:

AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute); 

onun sadece bir kez denilen ve (textBlock uygun kimlik değerini gösterirken) parametresi boş. ID özelliği çağrılmadan önce CanExecute çağrılır (hata ayıklayıcı ile kontrol edilir). Wpf, gerçek parametreye bağlanmadan önce canExecute'u çağırıyor ve bunu unutuyor gibi görünüyor. Bağlama bittiğinde ve uygun değer yüklendiğinde, CanExecute'u tekrar çağırmaz.

Add = new DelegateCommand<int?>(AddExecute); 

AddExecute doğru kimlik değeri ile çağrılır ve mükemmel çalışıyor: Ben sadece temsilci yürütmek ile komutunu kullanabilirsiniz Çözüm olarak

. Ama yine de CanExecute işlevselliğini kullanmak istiyorum. Herhangi bir fikir?

cevap

4

Bu senaryoda, Komuta için parametre olarak kullanılan özellikteki RaiseCanExecuteChanged() yöntemini çağırmak daha iyidir. Sizin durumunuzda, ViewModel'inizdeki ID özelliği (veya hangi DataContext'i kullanıyorsunuz) olur.

Böyle bir şey olurdu:

private int? _id; 
public int? ID 
{ 
    get { return _id; } 
    set 
    { 
     _id = value; 
     DelegateCommand<int?> command = ((SomeClass)CalcEditView.DataContext).Add; 
     command.RaiseCanExecuteChanged(); 
    } 
} 

etkisi ise çözüm olarak aynı olacaktır, ancak kod arkasında dışarı Komutanlığı mantığını tutar.

1

Parametreyi object olarak kullanıyorum ve int'a geri döndürüyorum.

Add = new DelegateCommand<object>(add, canAdd); 

ve eklenti yöntemde

void add(object parameter){ 
    int id = Convert.ToInt32(parameter); 

    //or simply 

    int id2 = (int)parameter; 

    //... 
    // do your stuff 
    //... 
}