2009-05-15 31 views
59

Si bien es trivial almacenar el estado marcado de una casilla en una variable utilizando el evento Click de la casilla de verificación, ¿cómo lo haría a través de enlace de datos? Todos los ejemplos que he encontrado tienen la UI actualizada de alguna fuente de datos, o unir un control a otro; Quiero actualizar una variable miembro cuando se hace clic en la casilla de verificación.WPF checkbox binding

TIA para cualquier punteros ...

Respuesta

40

Se necesita una propiedad de dependencia para esto:

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 vez hecho esto, se asocia la casilla a la propiedad de dependencia:

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

Para que esto funcione hay que nombrar a su ventana o control de usuario en su etiqueta de inicio, y el uso de ese nombre en la ElementName parámetro.

Con este código, cada vez que cambie la propiedad en el lado del código, cambiará el cuadro de texto. Además, cada vez que marque/desmarque el cuadro de texto, la Propiedad de dependencia también cambiará.

EDIT:

Una manera fácil de crear una propiedad de dependencia está escribiendo el propdp fragmento, que le dará el código general de las propiedades de dependencia.

Todo el código:

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

Note como el único código subyacente es la propiedad de dependencia. Tanto la etiqueta como la casilla de verificación están ligadas a ella. Si la casilla de verificación cambia, la etiqueta también cambia.

+0

Gracias por la respuesta. Parece que "ElementName" fue el ingrediente clave que falta. – Number8

+0

Me alegro de haber podido ayudar =) – Carlo

+2

Esto funcionará, pero no es cierto que "se necesita una propiedad de dependencia para esto". Vea las soluciones a continuación ... todo lo que necesita es una propiedad en su modelo de vista para enlazar. –

4

si tiene la propiedad "MyProperty" en su clase de datos, entonces obligar a la IsChecked como esto .... (el convertidor es opcional, pero a veces se necesita que)

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

Si su propiedad ya está booleano, no se necesita convertidor. –

+0

yup, es por eso que es "opcional" :-) –

+0
60

usted debe hacer su unión bidireccional:

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

Gracias Thomas, que lo ordenó para mí, estaba usando la propiedad Content. – Spidey

1

Debería ser más fácil que eso.Sólo tiene que utilizar:

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

Hola este es mi primera vez fijando así que por favor sea paciente: mi respuesta fue la creación de una simple propiedad:

 public bool Checked 
     { get; set; } 

A continuación, para establecer el contexto de datos de la casilla de verificación (llamados CB1):

cb1.DataContext = this; 

Luego de obligar a la proerty IsChecked de ella en el xaml

IsChecked="{Binding Checked}" 

El código es así:

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

Esto funciona para mí (código esencial sólo incluía, llenar más por sus necesidades):

En XAML un control de usuario es definido:

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

En código detrás para 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(....); 
    } 

} 

En algún lugar de la solución MyViewModel clase se define

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")); 
      } 
     } 
    } 
} 
Cuestiones relacionadas