2011-10-07 9 views
10

Sto imparando C# e sto costruendo un'interfaccia utente che legge e scrive interi in un file di configurazione XML. L'interfaccia utente utilizza una varietà di controlli utente personalizzati. Ho un controllo utente di 3 radiobutton che si lega a una singola variabile int (il controllo restituisce 0,1,2). Il controllo utilizza un evento per attivare l'aggiornamento. Guarda le 3 proprietà isChecked per determinare il nuovo valore int. Ma non so come aggiornare il valore di bind originale dal codice sottostante. Viene rimosso una volta per così dire perché ci sono due collegamenti ... uno nella finestra principale e uno nel controllo utente. Come un principiante sono perso a questo punto. BTW leggendo il valore int nei 3 radiobutton sta lavorando usando un convertitore.Posso aggiornare il valore di un'associazione WPF dal codice C# dietro?

ecco i xaml.cs controllo utente ...

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); } 
     } 
    } 
} 

ecco controllo utente 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> 

qui è un esempio del controllo di utente utilizzato in 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> 

qui è 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")); 
       } 
      } 
     } 
    } 
} 

Ci scusiamo per aver postato così tanto codice: penso che l'importante sia l'utente che controlla xaml.cs in cima.

Questo è un collegamento a un'immagine dell'interfaccia utente. Ho semplificato il codice che ho pubblicato per adattarlo. http://www.baytower.ca/photo/uiSample.jpg

Quindi - 'colore dei caratteri' (RV7sld_DFfontColor) può essere nero (0) verde (1) ciano (2)

Danny

+0

Si sta tentando di aggiornare il valore Binding 'RV7sld_DFfontColor' quando viene selezionato un altro pulsante di opzione? –

+0

Inoltre, per ciò che stai cercando di realizzare, ti invito a esaminare la proprietà di dipendenza 'RadioButton.GroupName'. –

+0

Sì, vorrei aggiornare il valore "RV7sld_DFfontColor" con "newValue" quando si fa clic su un radioButton. ... Inoltre, ho trovato perché i radioButton sono in un controllo utente sono già correttamente raggruppati. Quando ho assegnato un gruppo, ogni istanza del controllo utente ha utilizzato lo stesso gruppo ... quindi sembra funzionare bene senza. –

risposta

12

La classe BindingOperations consente di "forzare" gli aggiornamenti vincolanti in entrambe le direzioni.

Diciamo che c'è una proprietà di stringa X nel codice dietro e c'è un TextBox in XAML, legato a quella proprietà:

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

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

copiare da textBox1.Text al X effettuare le seguenti operazioni:

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

Per copiare da X a textBox1.Text, effettuare le seguenti operazioni:

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

Grazie, ho modificato la sezione Assegna nuovo valore per abbinare il tuo suggerimento. Non funziona ancora, ma continuerò a provare. –

+0

Funziona! Poiché i controlli WPF si trovano in un controllo utente personalizzato, vi sono due associazioni: una volta in MainWindow.xaml e una volta nel controllo ui3X.xaml. C'è anche un convertitore che verifica il valore int per generare un bool per il radiobutton.Una volta spostato il convertitore dalla mainWindow al controllo utente ha funzionato. Aggiornerò il codice sopra per riflettere le modifiche. Grazie :) –

+0

Grazie per il suggerimento! Mi permette di evitare l'implementazione di INotifyPropertyChanged solo per aggiornare una singola associazione. – piedar

Problemi correlati