2009-05-27 18 views
9

Mam okno dialogowe, które pojawia się na głównym ekranie (to w rzeczywistości kontrolka użytkownika, która pojawia się na stronie, jak na demo aplikacji od Billy'ego Hollisa) w mojej aplikacji, która ma dane z ekranu głównego do edycji. Główny ekran jest tylko do odczytu.Jak zatrzymać wiązanie właściwości przed aktualizacją?

Problem polega na tym, że po zmianie danych w oknie dialogowym aktualizuje się również dane na ekranie głównym. Najwyraźniej są one związane z tym samym obiektem, ale czy istnieje sposób, aby zatrzymać aktualizację wiązania, aż kliknę Zapisz w moim oknie dialogowym?

Odpowiedz

10

można użyć :

... 
<StackPanel Name="panel"> 
    <StackPanel.BindingGroup> 
     <BindingGroup Name="bindingGroup"/> 
    </StackPanel.BindingGroup> 
    <TextBox Text="{Binding Foo}"/> 
    <TextBox Text="{Binding Bar}"/> 
    <Button Name="btnSubmit" Content="Submit" OnClick="btnSubmit_Click"/> 
    <Button Name="btnCancel" Content="Cancel" OnClick="btnCancel_Click"/> 
</StackPanel> 
... 

Kod za:

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    panel.BindingGroup.BeginEdit(); 
} 

private void btnSubmit_Click(object sender, RoutedEventArgs e) 
{ 
    panel.BindingGroup.CommitEdit(); 
    panel.BindingGroup.BeginEdit(); 
} 

private void btnCancel_Click(object sender, RoutedEventArgs e) 
{ 
    panel.BindingGroup.CancelEdit(); 
    panel.BindingGroup.BeginEdit(); 
} 
+0

Świetny pomysł! Mam tylko to działa, jeśli zadeklarowałem grupę w każdym wiążącym oświadczeniu. Jest to jednak znacznie łatwiejsze niż inne alternatywy. – Telavian

0

one sposobem Widziałem tylko jak to zrobić, to Josh Smith wspomina here z konwerterów. Nie jest to jednak najłatwiejsza metoda.

3

Spójrz na właściwość Binding.UpdateSourceTrigger.

Można ustawić Binding w oknie jak tak

<TextBox Name="myTextBox" 
    Text={Binding Path=MyProperty, UpdateSourceTrigger=Explicit} /> 

a następnie wywołać metodę UpdateSource w przycisk Zapisz zdarzenie

myTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

Po nazywa UpdateSource obiekt źródłowy będzie zaktualizowany wartością z

+0

Próbowałem tego, ale to nie działa. Nadal aktualizuje TextBlock na głównym ekranie. Opcja Explicit określa, że ​​będzie aktualizowana tylko po wywołaniu metody UpdateSource, ale nie w tym przypadku. –

+0

Naprawdę? Jestem zaskoczony. Po prostu spróbowałem i działa to dla mnie. Może w twojej aplikacji jest coś, co powoduje problemy? – Ray

+0

To zdecydowanie działa, ale powinieneś przetestować wszystkie powiązania, aby wywołać funkcję UpdateSource() na każdym z nich. Najprostszym sposobem jest powiązanie powiązań z jedną Grupą BindingG. Jako bonus otrzymujesz niejawnie UpdateSourceTrigger na Explicit dla powiązanych powiązań. – Lu55

0

Wybieram również użyć BindingGroup. Ale zamiast wzorca IV, nazywam jawnie wszystkie powiązania powiązane z BindingGroup. Takie podejście pozwala mi dodać tylko jeden obsługi zdarzenia zamiast 3.

private void OkButton_Click(object sender, RoutedEventArgs e) 
{ 
    CommitChanges(); 
    DialogResult = true; 
    Close(); 
} 

private void CommitChanges() 
{ 
    foreach (var bindingExpression in this.BindingGroup.BindingExpressions) 
    { 
     bindingExpression.UpdateSource(); 
    } 
} 
Powiązane problemy