2011-10-20 11 views
5

Jak można ignorować zmiany w kontroli gdy występuje wiązania z danymi? Próbowałem spinanie różne imprezy jak gotfocus, TextChanged i leavefocus, ale jeśli kontrola ma już skoncentrować, a użytkownik „anuluje” ich zmiany, kiedy przeładować rekord i dane wiążące przejmuje, TextChanged myśli użytkownik pomimo zmiany od skupienie się na tej kontroli. Stos wywołań jest pusty. Czy są jakieś globalne zdarzenia powiązania danych, takie jak rozpoczęcie wiązania danych i zakończenie wiązania danych? Widzę, gdzie strzelam do OnProperyChanged, ale w ramach tego połączenia, wiązanie danych nie występuje. Wygląda na to, że robi się "w kolejce" i działa w innym punkcie.Ignorowanie text/zmiany wartości ze względu na Databinding

W pewnym momencie zamierzałem przechwycić zdarzenia zmiany właściwości w naszym modelu widoku, ale oznacza to, że nie wykryję i NIE MOŻNA WYŚWIETLAĆ wyświetlania formularza, dopóki użytkownik nie przejdzie kontroli. Wiem, wiem, mogę zmienić wszystkie moje powiązania tak, że wiązanie następuje niezwłocznie po każdej zmianie postaci, ale potem ten bałagan z niektórych przypadkach walidacji jako użytkownik nie skończył pisać w ich wartości.

Bardzo bym chciał, aby coś takiego jak TextChangedByUser wywołało, niezależnie od tego, czy użytkownik użył klucza, schowka, schowka na myszy, wszystkiego, co wywołał użytkownik.

po prostu nie może dowiedzieć się, jak odróżnić zmian użytkownika oraz zmian Databinding.

Odpowiedz

6

Chciałbym naprawdę kochać jakieś wydarzenie jak TextChangedByUser które ogień czy użytkownik użył klucza, schowka, schowka, myszy nic wyzwalany przez użytkownika.

po prostu nie może dowiedzieć się, jak odróżnić zmian użytkowników i zmian Databinding.

Nie używaj zdarzenie Text.TextChanged do wykrycia danych wprowadzonych przez użytkownika,
użyć zdarzenia Binding.SourceUpdated zamiast.

Lub bardziej ogólna: Nie używaj DP elementów wizualnych do wykrywania aktualizacji użytkownika, zamiast tego użyj zdarzenia Binding.SourceUpdated.

To RoutedEvent. Przy wiązaniu musisz ustawić NotifyOnSourceUpdated = true. Z pomocą UpdateSourceTrigger jesteś nawet w stanie dopracować, kiedy chcesz być informowany.


Twój XAML może być czegoś takiego:

<Grid x:Name="LayoutRoot" Binding.SourceUpdated="LayoutRoot_SourceUpdated"> 
    ... 
    <TextBox> 
     <TextBox.Text> 
      <Binding NotifyOnSourceUpdated="True" Path="path" UpdateSourceTrigger="PropertyChanged" > 
      </Binding> 
     </TextBox.Text> 
</Grid> 

Twoja impreza może być tak:

private void LayoutRoot_SourceUpdated(object sender, DataTransferEventArgs e) 
{ 
    // called every time s.th. changed by user 
} 

(edytowany powodu komentarzu)
Dlaczego jest to ważny sposób wykryć, czy dane wejście jest w jakiś sposób wyzwalane przez użytkownika?
W podanym przykładzie właściwość ścieżki TextContext "DataContext" to źródło, a właściwość "TextBox.Text" to target.
[Omówienie powiązania danych] http://msdn.microsoft.com/en-us/library/ms752347.aspx
Właściwość TextBox.Text została zmieniona po raz pierwszy po inicjowaniu powiązania i zapisaniu wartości źródłowej we właściwości "TextBox.Text". Ponieważ nie wiadomo, kiedy wiązanie ma miejsce, nie można użyć właściwości TextBox.Text ani żadnego z jej zdarzeń (np. TextChanged) w celu wykrycia danych wprowadzanych przez użytkownika. Stąd: Nie używaj zdarzenia Text.TextChanged do wykrywania danych wprowadzanych przez użytkownika !!! bardziej ogólne: nie używaj DP elementów wizualnych do wykrywania aktualizacji użytkownika !!!

Jeśli użytkownik zmienia zawartość pola tekstowego wizualnej przez co oznacza jakiejkolwiek zmiany w „TextBox.text” własność (system docelowy) .Po że wiązanie aktualizuje źródłowenaraz zdefiniowane przez UpdateSourceTrigger. To wtedy jest wywoływane zdarzenie SourceUpdated.

Przyznam, że nie widzę wpływu zmian na wiążące źródło spoza zakresu. Mam jednak pełną edytorową aplikację typu Desktop wykrywającą zmiany w ten sposób przez użytkownika i działa ona bardzo ładnie.

+0

Tak, znalazłem to już, chociaż tak naprawdę nie jest to, co chciałem bezpośrednio. Dodaję procedurę obsługi zdarzenia zdarzenia TargetUpdated obiektu wiązania. W tym przypadku obsługiwanym w ramach niestandardowych elementów sterujących resetuję flagi, których używam do śledzenia, jeśli użytkownik modyfikuje pole. To, co naprawdę chciałbym, to w każdej procedurze obsługi zdarzeń, aby móc przesłać zapytanie o pewną statyczną właściwość, która mówi mi, czy jest to wydarzenie wiążące, czy nie. – happyfirst

+0

imho naprawdę patrzysz na to w niewłaściwy sposób. Powinieneś rozważyć przeprojektowanie przejścia z TargetUpdated na SourceUpdated tak, jak sugerowałem. Zdasz sobie sprawę, że właśnie tego szukasz. "Bardzo chciałbym, aby w każdej procedurze obsługi zdarzenia była możliwość wysyłania zapytań o pewną statyczną właściwość, która mówi mi, czy jest to zdarzenie wiążące, czy nie". –

+0

Widzę, do czego dążysz. Zgaduję, że technicznie, źródło zaktualizowane zawsze będzie zawsze uruchamiane, a następnie aktualizowane? Będę eksperymentować z podpinaniem SourceUpdated – happyfirst

0

Należy zaktualizować Oprawa Kod ustawić następujące

{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} 

EDIT: Niestety, mam nadzorowane fakt, że już o tym wiedzą ... W takim razie, nie mogę pomóc: (

Powiązane problemy