【问题标题】:WPF Passing Multiple Parameters on Click of CheckboxWPF在单击复选框时传递多个参数
【发布时间】: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) 这是一个使用多个命令参数的示例:stackoverflow.com/questions/1350598/…

标签: wpf mvvm checkbox mouseevent


【解决方案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)
  • 当您拥有世界上所有的时间时,很容易做出正确的事情。在时间就是金钱且需要修复错误的现实世界中,解决方案并不总是很漂亮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多