2011-10-05 11 views
15

,Özel denetimde ikili komutlar nasıl oluşturulur? Benim SomeCustomControl olarak aşağıdaki gibi bir kod varsayarsak

public class SomeViewModel{ 
     ICommand ReloadCommand{get...} 
     ICommand SaveCommand{get..} 
} 

//SomeView.xaml 
<SomeCustomControl Reload="ReloadCommand" Save="SaveCommand" /> //NOT SURE HOW?? 

//SomeCustomContro.xaml 
<SomeCustomControl x:Name="someCustomControl"> 
<Button Command={Binding ElementName=someCustomControl, Path=Reload /> 
<Button Command={Binding ElementName=someCustomControl, Path=Save /> 
</SomeCustomControl> 

//SomeCustomControl.xaml.cs 
..... //NOT SURE HOW TO ALLOW BINDING TO A ICOMMAND ?? 

, ben "xaml ICommand bağlanmasının" desteklemesi gerekir. DependencyProperties'ın bu şekilde bağlandığını anlıyorum, ancak bu durumda ICommand'ı bağlama ihtiyacım var.

Birisi lütfen bunu yapmanın en iyi yolu nedir? Önerilen herhangi bir materyal ya da link kullanılacaktır çünkü bir yönüm eksik.

DÜZENLEME 1) SomeCustomControl içindeki DataContext SomeView'ı kullanabilirim. Çözemediğim ikisi arasında daha fazla mantık ve ayrılık vardır. SomeCustomControl'ümde bir yerdeki Reload/Save ICommands referansını korumalıyım.

Çok teşekkürler.

cevap

31

Doğrudan düz getireyim, Reload ve Save'a bağlamak ister misiniz? ilan ve iki bağımlılık özelliklerini ReloadCommandProperty ve SomeCustomControl türündeki ICommand ait SaveCommandProperty tanımlayan oluşturarak ihtiyacı

Yani. çalışmaya başlayacak RelodCommand ve SaveCommand özellikleri bu düzgün bağlanma sonra Yani SomeCustomControlControl kaynaklanmaktadır varsayarak

...

public class SomeCustomControl : Control 
{ 
    public static DependencyProperty ReloadCommandProperty 
     = DependencyProperty.Register(
      "ReloadCommand", 
      typeof (ICommand), 
      typeof (SomeCustomControl)); 

    public static DependencyProperty SaveCommandProperty 
     = DependencyProperty.Register(
      "SaveCommand", 
      typeof(ICommand), 
      typeof(SomeCustomControl)); 

    public ICommand ReloadCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(ReloadCommandProperty); 
     } 

     set 
     { 
      SetValue(ReloadCommandProperty, value); 
     } 
    } 

    public ICommand SaveCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(SaveCommandProperty); 
     } 

     set 
     { 
      SetValue(SaveCommandProperty, value); 
     } 
    } 
} 

...

 <SomeCustomControl RelodCommand="{Binding ViewModelReloadCommand}" 
         SaveCommand="{Binding ViewModelSaveCommand}" /> 
2

Komutunuzu döndürecek ve gerektiğinde bu özelliği bağlayacak bir özellik oluşturun.

private ICommand _reloadCommand; 
public ICommand ReloadCommand 
{ 
    get 
    { 
    if(_reloadCommand == null) _reloadCommand = CreateReloadCommand(); 
    return _reloadCommand; 
    } 
} 

Değişim

<Button Command={Binding ReloadCommand}" /> 

için kodunuzda bağlama Ve komutları içerir görünümü modeline özel denetim DataContext'i bağlamak.

+0

ben doğrudan bağlamak anlamına mı ICommand örneği bir denetimdeki bir özelliğe mi? Ayrıca, "CreateReloadCommand" ne için? Bu komut örneği, ViewModel'de oluşturulacak ve SomeCustomControl yalnızca bu örnek başvurusunu (xaml bağlamayı kullanarak) depolamalıdır. –

+0

ICommand türünün değerini istediğiniz gibi bağlayabilirsiniz, en anlamlı bağımlılık özelliği 'ButtonBase.CommandProperty'. 'CreateReloadCommand' komutunuzu yaratan bir yöntemdir - Komut oluşturma ve başlatma kodunu yazmak istemedim. Cevabımı yazarken, kodunuzdaki komutlara ilişkin yöntemleriniz vardır (bunları daha sonra değiştirdiniz). –

İlgili konular