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" />

我想将IsCheckedContent 属性值都传递给命令参数并从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在单击复选框时传递多个参数的主要内容,如果未能解决你的问题,请参考以下文章

如何让复选框在 WPF 数据网格中工作

单击表单复选框并传递复选框布尔值时如何在Django中刷新view.py?

选中在wpf中选择全部选中复选框

如何使用 IEditableObject 对象在 WPF DataGrid 中执行单击复选框选择

WPF,检测您正在从哪个选项卡导航

WPF 复选框绑定