WPF复选框绑定


76

使用复选框的Click事件将复选框的选中状态存储在变量中虽然很简单,但如何通过数据绑定来实现呢?我发现的所有示例都具有从某些数据源更新的UI,或将一个控件绑定到另一个控件的方法。单击复选框后,我想更新成员变量。

TIA的任何指针...

Answers:


54

为此,您需要一个依赖项属性:

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

完成后,将复选框绑定到依赖项属性:

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

为此,您必须在其openning标记中命名Window或UserControl,并在ElementName参数中使用该名称。

使用此代码,只要在代码端更改属性,就将更改文本框。另外,每当您选中/取消选中文本框时,Dependency属性也会更改。

编辑:

创建依赖项属性的一种简单方法是键入代码片段propdp,这将为您提供依赖项属性的常规代码。

所有代码:

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

请注意,后面的唯一代码是Dependency属性。标签和复选框都绑定到它。如果复选框更改,则标签也更改。


1
谢谢回复。似乎“ ElementName”是缺少的关键要素。
09年

5
这将起作用,但是“为此您需要依赖项属性”并不是真的。请参阅下面的解决方案...您所需要的只是视图模型上要绑定的属性。
Randy Gamage 2013年


13

您好,这是我第一次发布,因此请耐心等待:我的答案是创建一个简单的属性:

public bool Checked { get; set; }

然后设置Checkbox的数据上下文(称为cb1):

cb1.DataContext = this;

然后将它的IsChecked属性绑定到xaml中

IsChecked="{Binding Checked}"

代码是这样的:

XAML

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

后面的代码

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

4

如果您的数据类具有属性“ MyProperty”,则可以这样绑定IsChecked ...(转换器是可选的,但有时需要)

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

是的,这就是为什么它的“可选” :-)
Muad'Dib

<checkbox IsChecked =“ {Binding Path = Checked,Mode = TwoWay}” public bool Checked {得到{return _isChecked;} set {_isChecked = value;}}不高兴;_isChecked从未更改。
09年

然后检查您的DataContext,我自己使用它,它就像一个魅力。
Muad'Dib,2009年

2

应该比这容易。只需使用:

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


1

这对我有用(仅包含基本代码,请满足您的更多需求):

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

在后面的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(....);
    }

}

在解决方案类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"));
            }
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.