我正在学习WPF,似乎发现了一些奇怪的东西,我无法找到我搜索过的任何地方的原因。
我有一个窗口,上面有一个名为“chkTest”的复选框。我默认设置为true。
以下代码是我不明白的。基本上我正在尝试将“chkTest”控件设置为我即时创建的控件。消息框显示我在代码中设置的值,但窗口上的控件仍设置为true。
有人可以解释这背后的过程吗?
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
CheckBox chk = new CheckBox();
chk.IsChecked = false;
this.chkTest = chk;
MessageBox.Show(chk.IsChecked.Value.ToString());
}
}
由于
答案 0 :(得分:3)
这是因为你这样做是在欺骗DependencyProperty系统 - 请记住,DP属性的getter / setter与常规属性的工作方式不同。 UI在IsChecked属性上有一个触发器,但是您替换整个对象。由于您实际上没有在可见复选框上更改IsChecked,因此触发器不会触发,UI也不会更新。
答案 1 :(得分:3)
这是一种解决方法。首先,为主网格命名 - 比如LayoutRoot:
<Grid x:Name="LayoutRoot">
<CheckBox x:Name="chkTest" IsChecked="True"></CheckBox>
</Grid>
然后,你说:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
CheckBox chk = new CheckBox();
chk.IsChecked = false;
LayoutRoot.Children.Remove(chkTest);
LayoutRoot.Children.Add(chk);
}
}
你已经完成了。