我的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属性的绑定?
答案 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中的属性绑定?
您所做的已经是正确的(减去共享属性)。因此,如果您绑定到BoolProperty1
,BoolProperty2
和BoolProperty3
,并且每个属性都存在于您的视图模型中,那么一切都很好。您需要确保的是,复选框将视图模型作为其数据上下文。这通常通过为父组件(通常是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 EventToCommand和ICommand interface
答案 2 :(得分:0)
不是设置私有字段_boolProperty
,而是设置属性BoolProperty
,并在其setter中引发PropertyChanged事件。