web-dev-qa-db-fra.com

Liaison de case à cocher WPF

S'il est trivial de stocker l'état coché d'une case à cocher dans une variable à l'aide de l'événement Click de la case à cocher, comment le ferais-je via la liaison de données? Tous les exemples que j'ai trouvés ont l'interface utilisateur mise à jour à partir d'une source de données ou lient un contrôle à un autre; Je souhaite mettre à jour une variable de membre lorsque la case à cocher est activée.

TIA pour tous les pointeurs ...

71
Number8

Vous avez besoin d'une propriété de dépendance pour cela:

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

Une fois que cela est fait, vous liez la case à cocher à la propriété de dépendance:

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

Pour que cela fonctionne, vous devez nommer votre Window ou UserControl dans sa balise d'ouverture, et utiliser ce nom dans le paramètre ElementName.

Avec ce code, chaque fois que vous modifiez la propriété côté code, vous modifiez la zone de texte. De plus, chaque fois que vous cochez/décochez la zone de texte, la propriété de dépendance change également.

MODIFIER:

Un moyen simple de créer une propriété de dépendance consiste à saisir l'extrait de code propdp, qui vous donnera le code général des propriétés de dépendance.

Tout le code:

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

Notez que le seul code en arrière est la propriété de dépendance. L'étiquette et la case à cocher sont liées. Si la case à cocher change, l'étiquette change également.

50
Carlo

Vous devez rendre votre liaison bidirectionnelle:

<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/>
71
Thomas Levesque

Bonjour, ceci est ma première publication alors soyez patient: ma réponse a été de créer une propriété simple:

public bool Checked { get; set; }

Ensuite, pour définir le contexte de données de la case à cocher (appelée cb1):

cb1.DataContext = this;

Ensuite, pour lier la propriété IsChecked dans le xaml

IsChecked="{Binding Checked}"

Le code est comme ça:

XAML

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

code derrière

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

si vous avez la propriété "MyProperty" sur votre classe de données, alors vous liez l'IsChecked comme ceci .... (le convertisseur est optionnel, mais parfois vous en avez besoin)

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

Voici un article qui montre un exemple de liaison de données simple à une propriété IsChecked de deux cases à cocher, qui s’excluent mutuellement.

http://www.helplessautomomation.com/2011/01/wpf-coding-mutually-exclusive-check-boxes-with-data-binding/

J'espère que ça t'as aidé.

1
ElMatador

Cela fonctionne pour moi (code essentiel seulement inclus, remplissez davantage pour vos besoins):

En XAML, un contrôle utilisateur est défini:

<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 code derrière pour 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(....);
    }

}

Quelque part dans la classe de solution MyViewModel est défini

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"));
            }
        }
    }
}
1
pjm

Devrait être plus facile que ça. Il suffit d'utiliser:

<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" />
1
Tim W