Checkbox isEnabled行为无法弄清楚

时间:2013-09-19 10:03:45

标签: c# wpf checkbox

我的WPF应用程序中有三个CheckBox,我想要的是根据ViewModel中的一个属性禁用/启用CheckBoxes。

<Grid>
    <CheckBox x:Name="cbTest1" Margin="12,341,476,5" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <CheckBox x:Name="cbTest3" Margin="74,341,414,5" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay }" />
    <CheckBox x:Name="cbTest2" Margin="131,341,359,5" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay }" />
    <Button x:Name="btnClick" Click="btnClick_Click" Margin="231,333,29,5" />
</Grid>

在我的测试应用程序中,我编写了一个代码,用于点击按钮

private void btnClick_Click(object sender, RoutedEventArgs e)
    {
        if (_boolProperty == true)
        {
            _boolProperty = false;
            cbTest1.IsEnabled = false;
        }
        else
        {
            _boolProperty = true;
            cbTest1.IsEnabled = true;
        }
    }

奇怪的行为是,如果我评论cbTest1.IsEnabled = false;cbTest1.IsEnabled = true;,那么CheckBox将保持为禁用状态,

但只有一个CheckBox中的更改说“cbTest1”的值true也会对其他复选框进行更改。就像cbTest1.IsEnabled = true;一样,然后启用了所有三个CheckBox。 if cbTest1.IsEnabled = false;然后禁用所有三个CheckBox。

任何人都可以赐教。为什么会这样?绑定是如何发生在这里的? 还有一个问题,我如何使用viewModel中的属性来检查checkBoxes isEnabled属性的绑定?

3 个答案:

答案 0 :(得分:1)

<CheckBox x:Name="cbTest1" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay}" />
<CheckBox x:Name="cbTest3" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay}" />
<CheckBox x:Name="cbTest2" IsEnabled="{Binding Path=BoolProperty, Mode=TwoWay}" />

所有三个复选框都绑定到同一个源,因此无论您做什么,它们都将始终共享相同的状态。此外,您的绑定是双向绑定,因此为一个复选框手动设置IsEnabled将使您绑定的基础属性也发生更改,然后再次触发其他两个复选框进行更新。

如果您想拥有单独的状态,则必须使用三种不同的属性进行绑定。

  

如何将checkBoxes isEnabled属性与viewModel中的属性绑定?

您所做的已经是正确的(减去共享属性)。因此,如果您绑定到BoolProperty1BoolProperty2BoolProperty3,并且每个属性都存在于您的视图模型中,那么一切都很好。您需要确保的是,复选框将视图模型作为其数据上下文。这通常通过为父组件(通常是Window本身)提供数据上下文来实现:

Window window = new MyWindow();
window.DataContext = new MyViewModel();
window.Show();

答案 1 :(得分:1)

这是因为你拥有的每个复选框中的TwoWay绑定。当您启用其中一个时,它会将相应的视图模型属性设置为True,而TwoWay绑定会将其他复选框设置为True。这是你遇到这个问题的主要原因。

然后让我们从这些复选框中确定你想要什么。如果要单独更改每个复选框,则必须为每个复选框设置三个不同的视图模型属性。否则,您的行为是正常的,因为您只绑定到一个VM字段。

<Grid>
    <CheckBox x:Name="cbTest1" Margin="12,341,476,5" IsEnabled="{Binding Path=BoolProperty1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <CheckBox x:Name="cbTest3" Margin="74,341,414,5" IsEnabled="{Binding Path=BoolProperty2, Mode=TwoWay }" />
    <CheckBox x:Name="cbTest2" Margin="131,341,359,5" IsEnabled="{Binding Path=BoolProperty3, Mode=TwoWay }" />
    <Button x:Name="btnClick" Click="btnClick_Click" Margin="231,333,29,5" />
</Grid>

正如上面提到的@dzavala,你应该修改视图模型属性的值,而不是复选框本身。您应该使用命令进行按钮单击事件。阅读Commands, RelayCommands and EventToCommandICommand interface

答案 2 :(得分:0)

不是设置私有字段_boolProperty,而是设置属性BoolProperty,并在其setter中引发PropertyChanged事件。