2009-05-27 29 views
9

Tengo un cuadro de diálogo que aparece sobre la pantalla principal (en realidad es un control de usuario que aparece en la página según la demostración de la aplicación de Billy Hollis) en mi aplicación que tiene datos de la pantalla principal para editar. La pantalla principal es de solo lectura.¿Cómo impido que las propiedades de enlace se actualicen?

El problema que tengo es que cuando cambio los datos en el diálogo, los datos en la pantalla principal también se actualizan. Está claro que están vinculados al mismo objeto, pero ¿hay alguna manera de detener la actualización de enlace hasta que haga clic en Guardar en mi cuadro de diálogo?

Respuesta

10

Se puede usar un :

... 
<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> 
... 

Código atrás:

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

¡Excelente idea! Solo obtuve esto funcionando si declaro el grupo en cada enunciado vinculante. Sin embargo, esto es mucho más fácil que las otras alternativas. – Telavian

0

La única forma que he visto que se haga es como Josh Smith menciona here con convertidores. No es el método más fácil.

3

Eche un vistazo a la propiedad Binding.UpdateSourceTrigger.

Puede configurar el Binding en su diálogo como modo

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

Y luego llamar al método UpdateSource en el botón de guardar el evento

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

Una vez que usted ha llamado UpdateSource el objeto de origen será actualizado con el valor de TextBox

+0

Intenté esto pero no funciona. Todavía actualiza el TextBlock en la pantalla principal. La opción Explícito indica que solo se actualizará cuando se llame al método UpdateSource, pero no en este caso. –

+0

¿De verdad? Estoy sorprendido. Lo intenté y me funciona. Tal vez hay algo más en su aplicación que causa problemas? – Ray

+0

Definitivamente funciona pero debe iterar a través de todos los enlaces para llamar a UpdateSource() en cada uno. La forma más sencilla de hacerlo es asociar los enlaces a un BindingGroup. Como beneficio adicional, obtienes UpdateSourceTrigger establecido explícitamente en los enlaces asociados implícitamente. – Lu55

0

También elijo usar BindingGroup. Pero en lugar del modelo BeginEdit()/CommitEdit()/CancelEdit() llamo explícitamente a UpdateSource() en todos los enlaces asociados con BindingGroup. Este enfoque me permite agregar sólo un controlador de eventos en lugar de 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(); 
    } 
} 
Cuestiones relacionadas