WPF在单击复选框时传递多个参数
Posted
技术标签:
【中文标题】WPF在单击复选框时传递多个参数【英文标题】:WPF Passing Multiple Parameters on Click of Checkbox 【发布时间】:2013-05-08 17:05:39 【问题描述】:以下是我的 xaml:
<CheckBox Name="CheckBoxNoFindings" Content="No Findings" Command="Binding DisableRteCommand" CommandParameter="Binding Path=Content" Grid.Row="1" Grid.Column="1" Margin="2,5,0,3" />
我想将IsChecked
和Content
属性值都传递给命令参数并从VM 访问这些值。
虚拟机代码:
private void DisableRte(object args)
if (null != args)
string rteName = args.ToString();
实际要求是,在选中复选框时,应禁用文本框,并将复选框的内容应用于文本框的文本。而对面,在取消选中复选框时,应该启用文本框并且文本应该为空。
这种情况的任何解决方案?
【问题讨论】:
有很多方法可以做到这一点,但是更常见的是在视图模型上设置属性来代替。在您的情况下,您可以有 3 个字符串(您的 Contents)和 3 个布尔值(您的 IsChecked) 这是一个使用多个命令参数的示例:***.com/questions/1350598/… 【参考方案1】:嗯,你希望它完成的方式对我来说似乎有点奇怪。你为什么不在你的虚拟机中以“简单的方式”实现它?例如
public class CheckBoxExampleVm : ViewModelBase //assuming you have such a base class
private bool? _isChecked;
public bool? IsChecked
get return _isChecked;
set
_isChecked = value;
ModifyTextValue(value);
RaisePropertyChanged("IsChecked");
private string _textValue;
public string TextValue
get return _textValue;
set
_textValue = value;
RaisePropertyChanged("TextValue");
private void ModifyTextValue(bool? condition)
// do what ever you want with the text value
现在你只需要设置绑定,一切都很好。
另一种选择是使用转换器和元素绑定,这样您就不必在 VM 本身中实现它。
【讨论】:
在这里,问题是我有 03 个复选框和每个复选框 03 个文本框,所以我试图在所有复选框上使用一个通用命令来实现这一点。这就是我需要传递内容的原因。 那么您可以考虑使用ListView
,以便您可以绑定到CheckBoxExampleVm
的集合。然后,您可以在项目模板中声明组合。该命令可以在上级 VM 中实现并与当前的SelectedItem
一起使用。我的建议仍然有效。 - 你也可以考虑创建一个UserControl
来重用这个组合。但我更喜欢第一种解决方案。
再想一想。如果您使用ListView
实现它,您甚至不需要该命令。 CheckBoxExampleVm
会自动完成。【参考方案2】:
如果其他建议对您不起作用,您可以将整个 CheckBox
传递给 VM。
<CheckBox ... CommandParameter="Binding RelativeSource=RelativeSource Self"/>
【讨论】:
是的,一个解决方案,但一个丑陋的解决方案。它完全打破了 MVVM 模式。 VM 实现不应包含对视图相关组件(如控件或视图)的任何引用。 @DHN 我完全同意,但有时需要实施快速的“n”脏修复,比如没有时间重构别人的代码。 嗯,只有当你想有一个扔掉的结果。 ;o) 如果您正在使用其生命周期等进行真正的软件开发,那么绝对应该避免使用此类解决方案。但由于我们不知道背景,所以。这都是猜测。 :o) 当您拥有世界上所有的时间时,很容易做出正确的事情。在时间就是金钱且需要修复错误的现实世界中,解决方案并不总是很漂亮。以上是关于WPF在单击复选框时传递多个参数的主要内容,如果未能解决你的问题,请参考以下文章
单击表单复选框并传递复选框布尔值时如何在Django中刷新view.py?