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"/>
【讨论】:
是的,这就是它“可选”的原因:-)以上是关于WPF 复选框绑定的主要内容,如果未能解决你的问题,请参考以下文章