wpf CheckBox 命令参数
wpf CheckBox command parameter
在我的视图中,我有 8 个复选框都绑定到模型中的不同 属性,比方说 bool port1 ... port8
。单击相关复选框时,属性 会发生变化。
当用户选中或取消选中这些复选框之一时,我还执行绑定命令 'SetPortCommand'。该命令执行类似 SetPort(uint numPort, bool set)
的函数
我的观点是这样的:
<CheckBox x:Name="cbPort1" Content="port1" Command="{Binding SetPortCommand}">
<CheckBox.IsChecked>
<Binding Path="MyModel.Port1"/>
</CheckBox.IsChecked>
</CheckBox>
整个事情的背后是相当慢的硬件,所以我想避免为每个端口调用函数 SetPort()
。我可以使用 8 个命令,例如 SetPortCommand1 到 SetPortCommand8,但这会导致大量重复代码。
我有以下想法,但我不知道如何实现,哪个都不符合MVVM。
- 想法是以某种方式将常量传递给命令,告诉它应该检查或取消选中 8 个端口中的哪个。有没有简单的方法可以做到这一点?
- 想法是以某种方式使用 OnPropertyChanged()-Event 来调用此处的函数。
感谢任何帮助:-)
对于复选框,通常的方法是绑定 ischecked 并在其中执行操作 setter。这使用文本而不是布尔值,但您可以看到在 setter 中调用了一个方法。 https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Change_of_Variable
您在这组复选框中有一组重复的功能。
通常的方法是将视图模型的列表或可观察集合绑定到项目控件的项目源。将该数据模板化到您的 ui。在这里你有复选框。您的每个行视图模型都将保存有关端口的数据。姓名等等。
如果你特别想要一个命令,你可以有一个 ICommand,例如 delegatecommand 或 relaycommand 从以下任一绑定:
行视图模型——在这种情况下,它“知道”要作用于哪个端口。并且您使用该端口执行操作的代码位于视图模型行中。
或
到 window 视图模型,在这种情况下,行视图模型是按钮的数据上下文,它作为参数传递给 ICommand。
这两种都是使用按钮的常见场景,您应该可以通过谷歌搜索找到代码。
绑定 IsChecked 会更简单,因此更常用。
您可以避免执行命令并从每个 setter 调用您的方法,例如:
private bool _port1;
public bool Port1
{
get { return _port1; }
set { _port1 = value; SetPort(); }
}
如果 SetPort
修改了其他属性,您可以使用标志来确定是否应调用它:
private bool _setPort = true;
private bool _port1;
public bool Port1
{
get { return _port1; }
set
{
_port1 = value;
if (_setPort)
{
_setPort = false;
SetPort();
_setPort = true;
}
}
}
如果您出于某种原因仍想使用命令,您可以在命令的 Execute
方法中执行相同的操作。
_setPort
字段阻止为每个来源调用该方法 属性。
或者,您也可以避免在方法中设置 属性,而是设置支持字段并引发 PropertyChanged
事件:
_port2 = 真;
OnPropertyChanged(nameof(Port2));
这将绕过 setter 并避免调用该方法。
在我的视图中,我有 8 个复选框都绑定到模型中的不同 属性,比方说 bool port1 ... port8
。单击相关复选框时,属性 会发生变化。
当用户选中或取消选中这些复选框之一时,我还执行绑定命令 'SetPortCommand'。该命令执行类似 SetPort(uint numPort, bool set)
的函数
我的观点是这样的:
<CheckBox x:Name="cbPort1" Content="port1" Command="{Binding SetPortCommand}">
<CheckBox.IsChecked>
<Binding Path="MyModel.Port1"/>
</CheckBox.IsChecked>
</CheckBox>
整个事情的背后是相当慢的硬件,所以我想避免为每个端口调用函数 SetPort()
。我可以使用 8 个命令,例如 SetPortCommand1 到 SetPortCommand8,但这会导致大量重复代码。
我有以下想法,但我不知道如何实现,哪个都不符合MVVM。
- 想法是以某种方式将常量传递给命令,告诉它应该检查或取消选中 8 个端口中的哪个。有没有简单的方法可以做到这一点?
- 想法是以某种方式使用 OnPropertyChanged()-Event 来调用此处的函数。
感谢任何帮助:-)
对于复选框,通常的方法是绑定 ischecked 并在其中执行操作 setter。这使用文本而不是布尔值,但您可以看到在 setter 中调用了一个方法。 https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Change_of_Variable
您在这组复选框中有一组重复的功能。
通常的方法是将视图模型的列表或可观察集合绑定到项目控件的项目源。将该数据模板化到您的 ui。在这里你有复选框。您的每个行视图模型都将保存有关端口的数据。姓名等等。
如果你特别想要一个命令,你可以有一个 ICommand,例如 delegatecommand 或 relaycommand 从以下任一绑定:
行视图模型——在这种情况下,它“知道”要作用于哪个端口。并且您使用该端口执行操作的代码位于视图模型行中。
或
到 window 视图模型,在这种情况下,行视图模型是按钮的数据上下文,它作为参数传递给 ICommand。
这两种都是使用按钮的常见场景,您应该可以通过谷歌搜索找到代码。
绑定 IsChecked 会更简单,因此更常用。
您可以避免执行命令并从每个 setter 调用您的方法,例如:
private bool _port1;
public bool Port1
{
get { return _port1; }
set { _port1 = value; SetPort(); }
}
如果 SetPort
修改了其他属性,您可以使用标志来确定是否应调用它:
private bool _setPort = true;
private bool _port1;
public bool Port1
{
get { return _port1; }
set
{
_port1 = value;
if (_setPort)
{
_setPort = false;
SetPort();
_setPort = true;
}
}
}
如果您出于某种原因仍想使用命令,您可以在命令的 Execute
方法中执行相同的操作。
_setPort
字段阻止为每个来源调用该方法 属性。
或者,您也可以避免在方法中设置 属性,而是设置支持字段并引发 PropertyChanged
事件:
_port2 = 真;
OnPropertyChanged(nameof(Port2));
这将绕过 setter 并避免调用该方法。