虽然使用复选框的Click事件将复选框的选中状态存储在变量中是微不足道的,但我如何通过数据绑定来完成?我发现的所有示例都从某些数据源更新了UI,或者将一个控件绑定到另一个控件;我想在单击复选框时更新成员变量。
任何指针的TIA ......
答案 0 :(得分:68)
您必须双向绑定:
<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/>
答案 1 :(得分:47)
你需要一个依赖属性:
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参数中使用该名称。
使用此代码,无论何时更改代码端的属性,都将更改文本框。此外,每当您选中/取消选中文本框时,依赖属性也会更改。
编辑:
创建依赖项属性的一种简单方法是输入代码段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();
}
}
}
注意后面唯一的代码是依赖属性。标签和复选框都绑定到它。如果复选框发生更改,标签也会更改。
答案 2 :(得分:9)
您好,这是我第一次发帖,请耐心等待: 我的回答是创建一个简单的属性:
public bool Checked { get; set; }
然后设置Checkbox的数据上下文(称为cb1):
cb1.DataContext = this;
然后在xaml
中绑定它的IsChecked proertyIsChecked="{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 :(得分:4)
如果你的数据类上有属性“MyProperty”,那么就像这样绑定IsChecked ....(转换器是可选的,但有时你需要它)
<Window.Resources>
<local:MyBoolConverter x:Key="MyBoolConverterKey"/>
</Window.Resources>
<checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/>
答案 4 :(得分:1)
这是一篇文章,显示了两个复选框的IsChecked属性的简单数据绑定示例,这两个复选框是互斥的。
希望有所帮助。
答案 5 :(得分:1)
应该比那更容易。只需使用:
<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" />
答案 6 :(得分: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"));
}
}
}
}