【发布时间】:2013-04-29 06:15:16
【问题描述】:
我有一个包含 16 个 ToggleButtons 的页面,其中 12 个默认情况下处于禁用状态,并且只有在单击其余 4 个 ToggleButtons 中的任何一个后才会启用。有没有办法将 12 个禁用按钮的 IsEnabled 属性连接到 IsChecked 属性 4 个启用的按钮?
我之前使用几个 foreach 循环设法做到了这一点(并且目前正在尝试再次这样做),但我想必须有一种更优雅的方法来检查 IsChecked == true 是否不会循环通过子元素他们的父网格。不幸的是,原始项目在重新格式化期间丢失了,并且不存在项目文件的备份,因此必须从头开始重写代码。
【问题讨论】:
-
您可以在 XAML 中通过
IsEnabled={Binding IsChecked, ElementName=SomeOtherToggleButton}之类的方式执行此操作。但是,如果您想让这尽可能简单,您应该考虑使用 MVVM 模式开发您的应用程序;在视图模型中对此类行为进行建模非常容易。 -
我知道这种绑定语法,但如果我错了,请纠正我,难道只有绑定到单个元素时才有效吗?我需要绑定到 4 个 ToggleButtons,这样每当这 4 个中的任何一个被选中时,剩下的 12 个就会被启用。我也知道 MVVM 会让我的生活变得更轻松,但现在时间限制不允许这样做。
-
啊,我没有意识到您需要所有四个都处于活动状态。您仍然可以使用 in-XAML 绑定:只需使用
MultiBinding,输入是来自四个切换按钮的IsChecked状态。这个页面 (tech.pro/tutorial/809/wpf-tutorial-using-multibindings) 有一个关于如何设置它的快速教程(以及如何编写你需要的转换器。) -
非常感谢您提供的有用信息,但 Windows 应用商店应用似乎不支持 MultiBinding。哼哼。看起来有一个简单的解决方案。
-
MVVM 总是有时间的。将四个可用按钮 isChecked 分别绑定到 VM 上的一个单独的 observable bool 属性。使其他 12 个依赖于 VM 上的其他 observable bool 属性,在这第五个属性的 getter 中,测试是否检查了其他四个中的任何一个,如果是则返回 true。在前四个的 setter 中,调用 notify 属性在第五个 bool 上发生了变化。
标签: c# xaml windows-8 windows-runtime