简体   繁体   English

WPF复选框绑定

[英]WPF checkbox binding

While it is trivial to store a checkbox's checked state in a variable using the checkbox's Click event, how would I do it via databinding? 使用复选框的Click事件将复选框的选中状态存储在变量中虽然很简单,但如何通过数据绑定来实现呢? All the examples I have found have the UI updated from some datasource, or bind one control to another; 我发现的所有示例都具有从某些数据源更新的UI,或将一个控件绑定到另一个控件的方法。 I want to update a member variable when the checkbox is clicked. 单击复选框后,我想更新成员变量。

TIA for any pointers... 指针的TIA ...

您必须使绑定双向:

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

You need a dependency property for this: 为此,您需要一个依赖项属性:

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

Once that is done, you bind the checkbox to the dependency property: 完成后,将复选框绑定到依赖项属性:

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

For that to work you have to name your Window or UserControl in its openning tag, and use that name in the ElementName parameter. 为此,您必须在其windowing标记中命名Window或UserControl,并在ElementName参数中使用该名称。

With this code, whenever you change the property on the code side, you will change the textbox. 使用此代码,只要在代码端更改属性,就将更改文本框。 Also, whenever you check/uncheck the textbox, the Dependency Property will change too. 同样,每当您选中/取消选中文本框时,Dependency属性也会更改。

EDIT: 编辑:

An easy way to create a dependency property is typing the snippet propdp, which will give you the general code for Dependency Properties. 创建依赖项属性的一种简单方法是键入代码片段propdp,这将为您提供依赖项属性的常规代码。

All the code: 所有代码:

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

Notice how the only code behind is the Dependency Property. 请注意,后面的唯一代码是Dependency属性。 Both the label and the checkbox are bound to it. 标签和复选框都绑定到它。 If the checkbox changes, the label changes too. 如果复选框更改,则标签也更改。

Hello this is my first time posting so please be patient: my answer was to create a simple property: 您好,这是我第一次发布,因此请耐心等待:我的答案是创建一个简单的属性:

public bool Checked { get; set; }

Then to set the data context of the Checkbox (called cb1): 然后设置Checkbox的数据上下文(称为cb1):

cb1.DataContext = this;

Then to bind the IsChecked proerty of it in the xaml 然后将它的IsChecked属性绑定到xaml中

IsChecked="{Binding Checked}"

The code is like this: 代码是这样的:

XAML XAML

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

Code behind 后面的代码

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

if you have the property "MyProperty" on your data-class, then you bind the IsChecked like this.... (the converter is optional, but sometimes you need that) 如果您的数据类具有属性“ MyProperty”,则可以这样绑定IsChecked...。(转换器是可选的,但有时需要)

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

Should be easier than that. 应该比这容易。 Just use: 只需使用:

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

This works for me (essential code only included, fill more for your needs): 这对我有用(仅包含基本代码,请满足您的更多需求):

In XAML a user control is defined: 在XAML中,定义了一个用户控件:

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

In code behind for UserControl 在后面的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(....);
    }

}

Somewhere in solution class MyViewModel is defined 在解决方案类MyViewModel中的某个位置定义了

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

Here is a post that shows an example of simple data binding to a IsChecked property of a two check boxes, which are mutually exclusive. 这是一篇文章,显示了一个简单数据绑定到两个复选框的IsChecked属性的示例,这两个复选框是互斥的。

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

Hope that helps. 希望能有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM