2009-05-15 20 views
59

Mentre è banale archiviare lo stato di una casella di controllo in una variabile utilizzando l'evento Click della casella di controllo, come dovrei farlo tramite il collegamento dati? Tutti gli esempi che ho trovato hanno l'interfaccia utente aggiornata da qualche datasource, o vincola un controllo a un altro; Voglio aggiornare una variabile membro quando si fa clic sulla casella di controllo.Combinazione casella di controllo WPF

TIA per tutti i puntatori ...

risposta

40

Hai bisogno di una proprietà di dipendenza per questo:

public BindingList<User> Users 
    { 
     get { return (BindingList<User>)GetValue(UsersProperty); } 
     set { SetValue(UsersProperty, value); } 
    } 

public static readonly DependencyProperty UsersProperty = 
    DependencyProperty.Register("Users", typeof(BindingList<User>), 
     typeof(OptionsDialog)); 

Una volta fatto ciò, si associa il casella di controllo per la proprietà di dipendenza:

<CheckBox x:Name="myCheckBox" IsChecked="{Binding ElementName=window1, 
    Path=CheckBoxIsChecked}" /> 

Per funzionare è necessario chiamare il vostro finestra o UserControl nel suo tag openning, e usare quel nome nel ElementName parametro.

Con questo codice, ogni volta che si modifica la proprietà sul lato codice, si modifica la casella di testo. Inoltre, ogni volta che si seleziona/deseleziona la casella di testo, anche la proprietà dipendenze cambierà.

EDIT:

Un modo semplice per creare una proprietà di dipendenza è digitando il propdp frammento, che vi darà il codice generale per proprietà di dipendenza.

Tutto il codice:

XAML:

<Window x:Class="StackOverflowTests.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" x:Name="window1" Height="300" Width="300"> 
    <Grid> 
    <StackPanel Orientation="Vertical"> 
     <CheckBox Margin="10" x:Name="myCheckBox" 
       IsChecked="{Binding ElementName=window1, Path=IsCheckBoxChecked}" 
       >Bound CheckBox</CheckBox> 
     <Label Content="{Binding ElementName=window1, Path=IsCheckBoxChecked}" 
       ContentStringFormat="Is checkbox checked? {0}"></Label> 
     </StackPanel>  
    </Grid> 
</Window> 

C#:

using System.Windows; 

namespace StackOverflowTests 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public bool IsCheckBoxChecked 
     { 
      get { return (bool)GetValue(IsCheckBoxCheckedProperty); } 
      set { SetValue(IsCheckBoxCheckedProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for 
     //IsCheckBoxChecked. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty IsCheckBoxCheckedProperty = 
      DependencyProperty.Register("IsCheckBoxChecked", typeof(bool), 
      typeof(Window1), new UIPropertyMetadata(false)); 

     public Window1() 
     {    
      InitializeComponent(); 
     } 
    } 
} 

Notate come l'unico codice dietro è la proprietà di dipendenza. Sia l'etichetta che la casella di controllo sono associate ad essa. Se la casella di controllo cambia, anche l'etichetta cambia.

+0

Grazie per la risposta. Sembra che "ElementName" fosse l'ingrediente chiave mancante. – Number8

+0

Glad I could help =) – Carlo

+2

Funzionerà, ma non è vero che "hai bisogno di una proprietà di dipendenza per questo". Vedi le soluzioni di seguito ... tutto ciò di cui hai bisogno è una proprietà sul tuo viewmodel da associare. –

4

se avete la proprietà "MyProperty" sul vostro dei dati di classe, poi si associa l'IsChecked come questo .... (il convertitore è facoltativo, ma a volte è necessario che)

<Window.Resources> 
<local:MyBoolConverter x:Key="MyBoolConverterKey"/> 
</Window.Resources> 
<checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/> 
+6

Se la vostra proprietà è già booleana, non è necessario alcun convertitore. –

+0

sì, ecco perché è "opzionale" :-) –

+0
60

è necessario effettuare la bidirezionale vincolante:

<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/> 
+0

Grazie Thomas, che l'ha ordinato per me, stavo usando la proprietà Content. – Spidey

1

Dovrebbe essere più facile di così.Basta usare:

<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" /> 
8

Ciao Questa è la mia prima volta distacco quindi per favore siate pazienti: la mia risposta era quello di creare una semplice proprietà:

 public bool Checked 
     { get; set; } 

Poi per impostare il contesto dati della casella di controllo (chiamato CB1):

cb1.DataContext = this; 

Poi di impegnare la proerty IsChecked di esso in XAML

IsChecked="{Binding Checked}" 

il codice è simile a questo:

// the xaml 
 

 
<CheckBox x:Name="cb1" HorizontalAlignment="Left" 
 
     Margin="439,81,0,0" VerticalAlignment="Top" 
 
     Height="35" Width="96" IsChecked="{Binding Checked}"/> 
 
    
// the c# 
 

 
public partial class MainWindow : Window 
 
    { 
 
     public bool Checked 
 
     { get; set; } 
 
    
 

 
     public MainWindow() 
 
     { 
 
      InitializeComponent(); 
 

 
      cb1.DataContext = this; 
 
     } 
 

 
     private void myyButton_Click(object sender, RoutedEventArgs e) 
 
     { 
 

 
      MessageBox.Show(Checked.ToString()); 
 

 

 
     } 
 
    }

1

Questo funziona per me (codice essenziale incluso solo, riempire di più per le vostre esigenze):

In XAML un controllo utente è definita:

<UserControl x:Class="Mockup.TestTab" ......> 
    <!-- a checkbox somewhere within the control --> 
    <!-- IsChecked is bound to Property C1 of the DataContext --> 
    <CheckBox Content="CheckBox 1" IsChecked="{Binding C1, Mode=TwoWay}" /> 
</UserControl> 

Nel codice dietro per UserControl

public partial class TestTab : UserControl 
{ 
    public TestTab() 
    { 
     InitializeComponent(); // the standard bit 

    // then we set the DataContex of TestTab Control to a MyViewModel object 
    // this MyViewModel object becomes the DataContext for all controls 
     // within TestTab ... including our CheckBox 
     DataContext = new MyViewModel(....); 
    } 

} 

Da qualche parte in soluzione di classe MyViewModel è definita

public class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private bool m_c1 = true; 

    public bool C1 { 
     get { return m_c1; } 
     set { 
      if (m_c1 != value) { 
       m_c1 = value; 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("C1")); 
      } 
     } 
    } 
} 
Problemi correlati