2012-08-15 8 views
6

W poniższym przykładzie powiązaliśmy ViewModel z widokiem z jedną właściwością o nazwie Message. Ta właściwość jest powiązana z ramką tekstową z wiązaniem dwukierunkowym. W tym teście, robimy pewną wartość przymusu w ustawiaczu i podnoszenie właściwości zmieniamy ponownie.Wartość Coerce w ustawieniu właściwości - Silverlight 5

W Silverlight 4 wszystko działało idealnie. Jeśli właściwość komunikatu zmieni się w ustawieniu właściwości, pole tekstowe zobaczy nową wartość. Na przykład. wpisanie "A" w polu tekstowym i utrata fokusa spowoduje pojawienie się Aaaaaaaa, gdy wartość zostanie zmieniona.

W Silverlight 5 jednak wydaje się, że jest uszkodzony/zmieniony. Polecenie getter nigdy nie zostanie trafione po zmianie wartości w ustawniku. Dodanie IValueConverter pomiędzy, pokazuje, że metody Convert/ConvertBack nigdy nie są trafione. Wydaje się, że zmieniło się coś fundamentalnego między wersją 4 a 5. Czy były jakieś zmiany? Czy to błąd?

public class ViewModel : INotifyPropertyChanged 
{ 
    private string _message; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string Message 
    { 
     get 
     { 
      return _message; 
     } 
     set 
     { 
      _message = value; 
      this.RaisePropertyChanged(); 

      if (_message.Length < 10) 
      { 
       _message = _message.PadRight(10, 'a'); 
       this.RaisePropertyChanged(); 
      } 
     } 
    } 

    private void RaisePropertyChanged() 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs("Message")); 
     } 
    } 
} 

Odpowiedz

1

Zostało to potwierdzone jako błąd w Silverlight 5 firmy Microsoft. Występuje tylko w trybie debugowania, więc jest odpowiedni dla trybu zwolnienia.

Jeśli wyłączysz debugowanie wiązania XAML, problem zniknął.

Binding.IsDebuggingEnabled = false; 
3

Istnieje kilka obejścia tego problemu, który wydaje się być błąd w wiązania funkcji debugowania Silverlight 5'S (patrz odpowiedź @Ray Booysen za).

Po pierwsze, ważne jest, aby wiedzieć, że nie jest to problem w produkcji, a raczej występuje tylko podczas debugowania aplikacji. Obejścia są zatem tylko sposobem odtworzenia zachowania produkcyjnego w środowisku debugowania (chociaż niektóre funkcje debugowania są wyłączone).

Pierwszym z nich jest wyłączenie debugowania wiązania przy użyciu statycznego (udostępnionego w VB.Net) pola o nazwie IsDebuggingEnabled w klasie Binding. Dokumentacja zawiera następujące zalecenie.

zestaw to pole false w konstruktorze klasy aplikacji

Uwaga: Zmiana ta nie może ograniczać się do pojedynczego wiązania, ale raczej będzie dotyczyć wszystkich wiązań w aplikacji.

Drugim jest wyłączenie debugera Silverlight we właściwościach projektu dla projektu WWW obsługującego aplikację Silverlight. Wprowadź tę zmianę, wykonując następujące kroki.

  1. Kliknij prawym przyciskiem myszy projekt WWW w oknie Solution Explorer i wybierz Właściwości.
  2. Wybierz kartę Sieć.
  3. Przewiń w dół do sekcji Debuggery.
  4. Odznacz pole wyboru Silverlight.

Uwaga: Ta zmiana nie tylko blokuje wiązanie debugowanie dla aplikacji, ale również ogólne Silverlight debugowanie. Można jednak włączyć inne debuggery.

Powiązane problemy