2011-10-07 12 views
10

Estoy aprendiendo C# y construyendo una interfaz de usuario que lee y escribe enteros en un archivo de configuración XML. La interfaz de usuario usa una variedad de controles de usuario personalizados. Tengo un control de usuario de 3 botones de radio que se une a una sola variable int (el control devuelve 0,1,2). El control usa un evento para activar la actualización. Mira las propiedades 3 isChecked para determinar el nuevo valor int. Pero no sé cómo actualizar el valor de enlace original desde el código subyacente. Una vez eliminado, por así decirlo, porque hay dos enlaces ... uno en la ventana principal y otro en el control del usuario. Como principiante estoy perdido en este punto. Por cierto, leer el valor int en los 3 botones de radio funciona con un convertidor.¿Puedo actualizar el valor de un enlace WPF desde el código C# detrás?

Aquí está el xaml.cs de control del usuario ...

namespace btsRV7config.controls 
{ 
    public partial class ui3X : UserControl 
    { 
     public ui3X() 
     { 
      InitializeComponent(); 
     } 

     void _event(object sender, RoutedEventArgs e) 
     { 
      int newValue = 0; 
      if (rdbttn1.IsChecked == true) { newValue = 0; } 
      else if (rdbttn2.IsChecked == true) { newValue = 1; } 
      else if (rdbttn3.IsChecked == true) { newValue = 2; } 
      txtb.Text = newValue.ToString(); //tempRemove 

      // !!! assign newValue to Binding Source !!! 
      //--------------------------------------------- 
      uiBinding1 = newValue; 
      BindingOperations.GetBindingExpression(rdbttn1, RadioButton.IsCheckedProperty).UpdateSource(); 
      //--------------------------------------------- 
     } 

     public static readonly DependencyProperty uiBinding1Property = DependencyProperty.Register("uiBinding1", typeof(int), typeof(ui3X)); 
     public int uiBinding1 
     { 
      get { return (int)GetValue(uiBinding1Property); } 
      set { SetValue(uiBinding1Property, value); } 
     } 

     public static readonly DependencyProperty uiBinding2Property = DependencyProperty.Register("uiBinding2", typeof(int), typeof(ui3X)); 
     public int uiBinding2 
     { 
      get { return (int)GetValue(uiBinding2Property); } 
      set { SetValue(uiBinding2Property, value); } 
     } 

     public static readonly DependencyProperty uiBinding3Property = DependencyProperty.Register("uiBinding3", typeof(int), typeof(ui3X)); 
     public int uiBinding3 
     { 
      get { return (int)GetValue(uiBinding3Property); } 
      set { SetValue(uiBinding3Property, value); } 
     } 
    } 
} 

aquí es el control de usuario xaml

<UserControl x:Class="btsRV7config.controls.ui3X" 
      x:Name="root" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Orientation="Horizontal" Height="22"> 

     <RadioButton Name="rdbttn1" VerticalAlignment="Center" Margin="0 0 10 0" 
        IsChecked="{Binding ElementName=root, Path=uiBinding1}" 
        Click="_event" /> 

     <RadioButton Name="rdbttn2" VerticalAlignment="Center" Margin="0 0 10 0" 
        IsChecked="{Binding ElementName=root, Path=uiBinding2}" 
        Click="_event" /> 

     <RadioButton Name="rdbttn3" VerticalAlignment="Center" 
        IsChecked="{Binding ElementName=root, Path=uiBinding3}" 
        Click="_event" /> 

     <TextBox Name="txtb" Margin="5 0 0 0" Width="20" Height="17" /> <!-- tempRemove --> 
    </StackPanel> 
</UserControl> 

aquí es un ejemplo del control de usuario utilizado en MainWindow.xaml

<Window x:Class="btsRV7config.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:controls="clr-namespace:btsRV7config.controls" 
     xmlns:converter="clr-namespace:btsRV7config.converters" 
     Title="Vans RV7 Configuration" Height="350" Width="525" > 
    <Window.Resources> 
     <converter:Int_Int_Bool_Converter x:Key="Int_Int_Bool" /> 
    </Window.Resources> 

    <Grid> 
     <controls:ui3X uiName="Font Color" ui1="Black" ui2="Green" ui3="Cyan" 
         uiBinding1="{Binding RV7sld_DFfontColor, Converter={StaticResource Int_Int_Bool}, ConverterParameter=0}" 
         uiBinding2="{Binding RV7sld_DFfontColor, Converter={StaticResource Int_Int_Bool}, ConverterParameter=1}" 
         uiBinding3="{Binding RV7sld_DFfontColor, Converter={StaticResource Int_Int_Bool}, ConverterParameter=2}" /> 
    </Grid> 
</Window> 

aquí es MainWindow.xaml.cs

namespace btsRV7config 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      record data = new record(); 
      DataContext = data; 
     } 
    } 

    public class record : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private int _RV7sld_DFfontColor = RV7sld_dict["DFfontColor"]; 
     public int RV7sld_DFfontColor 
     { 
      get 
      { return _RV7sld_DFfontColor; } 
      set 
      { 
       _RV7sld_DFfontColor = value; 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs("RV7sld_DFfontColor")); 
       } 
      } 
     } 
    } 
} 

Lo siento por publicar tanto código: creo que lo importante es que el usuario controla xaml.cs en la parte superior.

aquí hay un enlace a una imagen de la interfaz de usuario. He simplificado el código que he publicado para que quepa. http://www.baytower.ca/photo/uiSample.jpg

Por lo tanto - 'Color de fuente' (RV7sld_DFfontColor) puede ser de color negro (0) verde (1) cian (2)

Danny

+0

¿Está intentando actualizar el valor Binding 'RV7sld_DFfontColor' cuando se selecciona un botón de opción diferente? –

+0

Además, por lo que intenta lograr, le insto a que investigue la propiedad de dependencia 'RadioButton.GroupName'. –

+0

Sí, me gustaría actualizar el valor "RV7sld_DFfontColor" con "newValue" cuando se hace clic en un radioButton. ... También encontré que, dado que los radioButton están en un control de usuario, ya están agrupados correctamente. Cuando asigné un grupo, cada instancia del control de usuario utilizó el mismo grupo ... por lo que parece funcionar bien sin. –

Respuesta

12

La clase BindingOperations le permite "forzar" las actualizaciones de enlace en cualquier dirección.

Digamos que hay una propiedad de cadena X en el código detrás y hay una TextBox en XAML, con destino a esa propiedad:

// C#: 
public string X { get; set; } 

// XAML: 
<TextBox Name="textBox1" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1}, Path=X}" /> 

Para copiar desde textBox1.Text a X haga lo siguiente:

BindingOperations.GetBindingExpression(textBox1, TextBox.TextProperty).UpdateSource(); 

Para copiar de X a textBox1.Text haga lo siguiente:

BindingOperations.GetBindingExpression(textBox1, TextBox.TextProperty).UpdateTarget(); 
+0

Gracias, he cambiado la sección Asignar nuevo valor para que coincida con su sugerencia. Todavía no funciona, pero lo seguiré intentando. –

+0

¡Funciona! Como los controles WPF están en un control de usuario personalizado, hay dos enlaces: uno en MainWindow.xaml y otro en el control ui3X.xaml. También hay un convertidor que prueba el valor int para generar un bool para el botón de radio.Una vez que moví el convertidor de la ventana principal al control del usuario, funcionó. Actualizaré el código anterior para reflejar los cambios. Gracias :) –

+0

¡Gracias por el consejo! Me permite evitar la implementación de INotifyPropertyChanged solo para actualizar un enlace único. – piedar

Cuestiones relacionadas