问题描述
虽然使用复选框的 Click 事件将复选框的选中状态存储在变量中很简单,但我将如何通过数据绑定来做到这一点?我发现的所有示例都从某个数据源更新了 UI,或者将一个控件绑定到另一个控件;我想在单击复选框时更新成员变量.
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? All the examples I have found have the UI updated from some datasource, or bind one control to another; I want to update a member variable when the checkbox is clicked.
任何指针的 TIA...
TIA for any pointers...
推荐答案
为此您需要一个依赖属性:
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}" />
为此,您必须在其开始标记中命名您的 Window 或 UserControl,并在 ElementName 参数中使用该名称.
For that to work you have to name your Window or UserControl in its openning tag, and use that name in the ElementName parameter.
使用此代码,无论何时更改代码端的属性,都会更改文本框.此外,每当您选中/取消选中文本框时,依赖属性也会发生变化.
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.
创建依赖属性的一种简单方法是输入代码片段 propdp,它会为您提供依赖属性的通用代码.
An easy way to create a dependency property is typing the snippet propdp, which will give you the general code for Dependency Properties.
全部代码:
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();
}
}
}
注意背后的唯一代码是依赖属性.标签和复选框都绑定到它.如果复选框更改,标签也会更改.
Notice how the only code behind is the Dependency Property. Both the label and the checkbox are bound to it. If the checkbox changes, the label changes too.
这篇关于WPF 复选框绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2