C#和WPF:程序控制

时间:2008-12-12 20:17:32

标签: c# wpf controls

我正在学习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());
    }
}

由于

2 个答案:

答案 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);
    }
}

你已经完成了。