2012-10-18 14 views
7

ile CanExecute nasıl kullanılır Bir DüğmeMvvmcross

<Button 
     android:id="@+id/ButtonConnect" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Disconnect" 
     local:MvxBind="{'Click':{'Path':'DisconnectCommand'}}" /> 

var Ve

public IMvxCommand DisconnectCommand 
{ 
    get 
    { 
     return new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect); 
    } 
} 

Sonra kullanarak DisconnectCommand etkinleştirmek/devre dışı bırakmak istediğiniz için bir Command var

DisconnectCommand.CanExecute(this.GetService<IConnectionService>().UsbConnected); 

Ama bu açıkça yanlış (Bu çalışmıyor), ben aa parametre olarak kontrol koydu, ama normalde

DisconnectCommand.CanExecute = someBool; 

Ancak, ayarlanacak özellik yok, bundan nasıl bahsedilir?

+0

'UsbConnected' bir yöntem mi yoksa özellik mi? –

+0

Bu bir özellik – Mech0z

cevap

7

CanExecute'u kullanmayı öğrenmek için, Silverlight veya WPF'ye bir göz atın - orada ICommand - ör. http://weblogs.asp.net/nmarun/archive/2009/12/02/using-icommand-silverlight-4.aspx veya http://blog.galasoft.ch/archive/2009/09/26/using-relaycommands-in-silverlight-and-wpf.aspx

şöyle bir örnek verilebilir gibi bir şey:

CanExecute gerçekten tam karşısında tüm MvxBindings genelinde uygulanmadı

private MvxRelayCommand _disconnectCommand; 
public IMvxCommand DisconnectCommand 
{ 
    get 
    { 
     if (_disconnectCommand == null) 
      _disconnectCommand = new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect, item => this.IsItemConnected(item)); 
     return _disconnectCommand; 
    } 
} 

private void SomeServiceNotificationHandler() 
{ 
    _disconnectCommand.RaisePropertyChanged(); 
} 

private bool IsItemConnected(object thing) 
{ 
    return /* your code */; 
} 

olsa küçük bir sorun var .... tüm platformlar ... Bazıları için işe yarayacak, ama bazıları için değil - ve şu andakileri gerçekten bilmiyorum! Sorunlarla karşılaşırsanız, o zaman ... Beni onlar sabit alacak biliyorum (GitHub konular üzerinden) ve Kişisel


bildirin lütfen ... Ben CanExecute kullanma eğiliminde yok - Bir kullanmak yerine eğiliminde Daha sonra kontrol edebileceğiniz herhangi bir mülke bağlandığım ayrı Boolean özelliği - örn. En kontrolleri vb Enabled gibi bir şey, IsEnabled, Disabled, IsDisabled sahip

Genellikle daha kolay (ve daha okunabilir) Boole özelliği ayarlamak için yerine RaiseCanExecuteChanged

aramaya bulmak mesela Ben böyle bir şey kullanmak istiyorum:

<Button 
    android:id="@+id/ButtonConnect" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Disconnect" 
    local:MvxBind="{'Click':{'Path':'DisconnectCommand'},'Enabled':{'Path':'UsbConnected'}}" /> 

Kesinlikle CanExecute yaklaşım avantajlara sahip olduğunu iddia edebilir - hepsi bir nesneye Komut mantığı tutar çünkü ve o RelayCommand içinde oluyor Execute aramaları engellemek için kullanılabilir, çünkü . Bu yüzden, biz onları bulduğumuzdan, mvvmcross bağlantılarında CanExecute hatalarını düzeltmeye çalışıyorum.

+1

Ben inşa işlevselliğini kullanmak için kötü bir fikir olduğunu düşünüyorum. Boole'larla yaklaşımınız kod tabanına oldukça fazla karmaşa katıyor. –

+2

Evet ... ama MonoDroid ve MonoTouch için tüm bağları yazması gereken kişi siz değilsiniz :) – Stuart

+0

Üzgünüm, bu yorumu anlamıyorum :-) –

3

Stuart'ın yanıtını takip etmek için, hem Android'i hem de iOS Mvx bağlantılarını desteklemek için özellikleri gösterme ile birlikte hem ICommand.CanExecute'u desteklemek de kolaydır.

Bunu yapmak için, özellikler için tipik CanExecute() yöntemlerinizi dönüştürün, ardından ilişkili mülkte çağrıları için RaisePropertyChanged numaralı çağrıları ekleyin. Sonra normal olarak RaiseCanExecuteChanged kullanın ve PropertyChanged olay da kovulur.

... 

    // constructor 
    public SomeClass() 
    { 

     DoSomethingCommand = new MvxCommand(OnDoSomething,() => CanDoSomething); 
     DoSomethingCommand .CanExecuteChanged += (sender, args) => RaisePropertyChanged(() => CanDoSomething); 
    } 

    public bool CanDoSomething 
    { 
     get { ... } 
    } 

    ... 
İlgili konular