WPFcheckbox绑定
虽然使用checkbox的Click事件将checkbox的选中状态存储在variables中是微不足道的,但是如何通过数据绑定来完成? 我发现的所有示例都有从某个数据源更新的UI,或者将一个控件绑定到另一个控件; 我想单击checkbox时更新成员variables。
TIA任何指针
你需要一个依赖项属性:
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绑定到依赖项属性:
<CheckBox x:Name="myCheckBox" IsChecked="{Binding ElementName=window1, Path=CheckBoxIsChecked}" />
为了达到这个目的,你必须在你的窗口或者用户控件的打开标签中命名,并且在ElementName参数中使用这个名字。
有了这段代码,无论何时在代码中更改属性,都将更改文本框。 此外,无论您选中/取消选中该文本框,依赖项属性也会更改。
编辑:
创build依赖属性的简单方法是input代码片段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}"></Label> </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(); } } }
注意背后的唯一代码是依赖属性。 标签和checkbox都绑定到它。 如果checkbox更改,则标签也会更改。
您必须使您的绑定双向:
<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/>
您好,这是我第一次发布,请耐心等待:我的答案是创build一个简单的属性:
public bool Checked { get; set; }
然后设置checkbox(称为cb1)的数据上下文:
cb1.DataContext = this;
然后在xaml中绑定它的IsChecked属性
IsChecked="{Binding Checked}"
代码是这样的:
// the xaml <CheckBox x:Name="cb1" HorizontalAlignment="Left" Margin="439,81,0,0" VerticalAlignment="Top" Height="35" Width="96" IsChecked="{Binding Checked}"/>
// the c# 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()); } }
如果你的数据类有属性“MyProperty”,那么你像这样绑定IsChecked ….(转换器是可选的,但有时你需要)
<Window.Resources> <local:MyBoolConverter x:Key="MyBoolConverterKey"/> </Window.Resources> <checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/>
这里是一个post,显示了一个简单的数据绑定到两个checkbox,这是互斥的IsChecked属性的一个例子。
希望有所帮助。
应该比这更容易。 只要使用:
<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" />
这适用于我(只包括必要的代码,为您的需要填充更多):
在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(....); } }
解决scheme类中的某处定义了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")); } } } }