WPF 复选框绑定

Posted

技术标签:

【中文标题】WPF 复选框绑定【英文标题】:WPF checkbox binding 【发布时间】:2010-10-26 14:10:39 【问题描述】:

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

任何指针的 TIA...

【问题讨论】:

【参考方案1】:

为此你需要一个依赖属性:

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

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

使用此代码,无论何时更改代码端的属性,都会更改文本框。此外,每当您选中/取消选中文本框时,依赖属性也会发生变化。

编辑:

创建依赖属性的一种简单方法是输入 sn-p propdp,它将为您提供依赖属性的通用代码。

所有代码:

XAML:

<Window x:Class="***Tests.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 ***Tests

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

注意背后唯一的代码是依赖属性。标签和复选框都绑定到它。如果复选框发生变化,标签也会发生变化。

【讨论】:

感谢您的回复。看来“ElementName”是缺少的关键成分。 这会起作用,但“你需要一个依赖属性”这不是真的。请参阅下面的解决方案...您所需要的只是要绑定到的视图模型上的属性。【参考方案2】:

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

public bool Checked  get; set; 

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

cb1.DataContext = this;

然后在 xaml 中绑定它的 IsChecked 属性

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

【讨论】:

【参考方案3】:

这对我有用(仅包括基本代码,根据您的需要填写更多):

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

你必须让你的绑定双向:

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

【讨论】:

谢谢 Thomas,帮我整理了,我使用的是 Content 属性。【参考方案6】:

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

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

【讨论】:

是的,这就是它“可选”的原因:-) 然后检查您的 DataContext,我自己正在使用它,它就像一个魅力。

以上是关于WPF 复选框绑定的主要内容,如果未能解决你的问题,请参考以下文章

WPF 将枚举列表(或类似列表)绑定到复选框列表

WPF MVVM中的绑定复选框问题

WPF 双向绑定不适用于组合框中的复选框

WPF DataGrid 中的自定义复选框不更新绑定

wpf 4.0 datagrid模板列双向绑定问题

WPF 复选框:检查更改的处理