2010-11-25 45 views
0

J'ai une classe d'entités dans une classe de bibliothèque C# et lié à la bibliothèque de classe Silverlight (entités doit être en classe C# en raison de compatiblité existant avec d'autres systèmes)MVVM propriété avec une classe complexe liée et CanExecute relais de commande ne fonctionne pas

Exemple (bibliothèque C#):

public class TestClass 
{   
    private string _testValue; 
    public string TestValue 
    { 
     get { return _testValue; } 
     set 
     { 
      if (_testValue!= value) 
      { 
       _testValue = value; 
       OnPropertyChanged("TestValue"); 
      } 
     } 
    }} 

Cette classe est liée à la bibliothèque de classe Silverlight.

Sur un MVVM il y a une propriété

private TestClass _testProp = new TestClass(); 
     public TestClass TestProp 
     { 
      get 
      { 
       return _testProp ; 
      } 
      set 
      { 
       if (value != _testProp) 
       { 
        _testProp = value; 
        RaisePropertyChanged("TestProp"); 
        PressCommand.CanExecuteChanged(); 
       } 
      } 
     } 

La propriété est binded à un contrôle en XAML

<TextBox Text="{Binding TestProp.TestValue, Mode=TwoWay}"> 
<Button Content="Press" Command="{Binding PressCommand}" /> 

Je veux contrôler le bouton avec RelayCommands CanExecute dépendait de la TestValue dans TestClass. ..

PressCommand = new RelayCommand(() => 
    { 
     DoSomething(); 
    },() => TestProp.TestValue != string.empty); 

Cependant, si le TestValue est modifié (chaîne différente puis vide), Pres sCommand CanExecute doen't semblent remarquer le changement et n'est pas activé, le rendant inutilisable ...

Est-il possible d'utiliser le CanExecute avec ce genre de set-tu

Répondre

1

Ce que vous devez faire est d'appeler PressCommand.CanExecuteChanged() lorsque la valeur change. Pour ce faire, écouter bien pour le changement de propriété de la valeur de la propriété

VM

public TestClass TestProp 
    { 
     get 
     { 
      return _testProp ; 
     } 
     set 
     { 
      if (value != _testProp) 
      { 
       if(_testProp != null) 
       { 
        _testProp.PropertyChanged -= TestPropChanged; 
       } 


       _testProp = value; 

       if(_testProp != null) 
       { 
        _testProp.PropertyChanged += TestPropChanged; 
       } 

       RaisePropertyChanged("TestProp"); 
       PressCommand.CanExecuteChanged(); 
      } 
     } 
    } 

private void TestPropChanged(object sender, PropertyChangedEventArgs e) 
{ 
     //Can check for specific property if required... 

     PressCommand.CanExecuteChanged(); 
} 
+0

Merci! Votre soultion/walkaround fonctionne très bien! BTW le GalaSoft MVVM est RaiseCanexecuteChanged(), pas CanExecuteChanged() mon mauvais, désolé pour quiconque lisant ... – KolarJ

+0

Il ya un problème avec cette solution. Cela ne fonctionne pas avec le contrôle NumericUpDown de Silverlight Toolkit ... Il semble que la valeur du contrôle NumericUpDown soit mise à jour après la "prise". – KolarJ

+0

@KolarJ Posez peut-être une autre question sur NumericUpDown car je n'ai pas joué avec autant – aqwert