我之前的问题不准确,我正在更新。
我有 24 个按钮,它们向我正在通信的处理器发送打开/关闭命令。
// Card1 open channel
OpenCard1Channel1Command = new RelayCommand( OpenCardChannel( 0, 1 ) );
OpenCard1Channel2Command = new RelayCommand( OpenCardChannel( 0, 2 ) );
OpenCard1Channel3Command = new RelayCommand( OpenCardChannel( 0, 3 ) );
OpenCard1Channel4Command = new RelayCommand( OpenCardChannel( 0, 4 ) );
OpenCard1Channel5Command = new RelayCommand( OpenCardChannel( 0, 5 ) );
OpenCard1Channel6Command = new RelayCommand( OpenCardChannel( 0, 6 ) );
OpenCard1Channel7Command = new RelayCommand( OpenCardChannel( 0, 7 ) );
OpenCard1Channel8Command = new RelayCommand( OpenCardChannel( 0, 8 ) );
// Card2 open channel
OpenCard2Channel1Command = new RelayCommand( OpenCardChannel( 1, 1 ) );
OpenCard2Channel2Command = new RelayCommand( OpenCardChannel( 1, 2 ) );
OpenCard2Channel3Command = new RelayCommand( OpenCardChannel( 1, 3 ) );
OpenCard2Channel4Command = new RelayCommand( OpenCardChannel( 1, 4 ) );
OpenCard2Channel5Command = new RelayCommand( OpenCardChannel( 1, 5 ) );
OpenCard2Channel6Command = new RelayCommand( OpenCardChannel( 1, 6 ) );
OpenCard2Channel7Command = new RelayCommand( OpenCardChannel( 1, 7 ) );
OpenCard2Channel8Command = new RelayCommand( OpenCardChannel( 1, 8 ) );
// Card3 open channel
OpenCard3Channel1Command = new RelayCommand( OpenCardChannel( 2, 1 ) );
OpenCard3Channel2Command = new RelayCommand( OpenCardChannel( 2, 2 ) );
OpenCard3Channel3Command = new RelayCommand( OpenCardChannel( 2, 3 ) );
OpenCard3Channel4Command = new RelayCommand( OpenCardChannel( 2, 4 ) );
OpenCard3Channel5Command = new RelayCommand( OpenCardChannel( 2, 5 ) );
OpenCard3Channel6Command = new RelayCommand( OpenCardChannel( 2, 6 ) );
OpenCard3Channel7Command = new RelayCommand( OpenCardChannel( 2, 7 ) );
OpenCard3Channel8Command = new RelayCommand( OpenCardChannel( 2, 8 ) );
这是示例命令,我有它 1,2,3,4...
public ICommand OpenCard1Channel1Command
{
get; set;
}
这就是我尝试更新按钮背景的方式,卡 1 和卡 2 的方式相同。我删除了 OpenCardChannel 的那部分
public Action OpenCardChannel (int cardIndex, int channelIndex)
{
if ( cardIndex == 0 )
{
if ( buttonStates0 [channelIndex - 1] == Brushes.DarkRed )
{
return () =>
{
Trace.WriteLine( $"0.card channel {channelIndex} with current condition DarkRed" );
ChangeButtonState( 0, channelIndex - 1, Brushes.LimeGreen );
scModel.SendChannelOpenRequest( cardIndex, channelIndex );
};
}
else if ( buttonStates0 [channelIndex - 1] == Brushes.LimeGreen )
{
return () =>
{
Trace.WriteLine( $"0.card channel {channelIndex} with current condition LimeGreen" );
ChangeButtonState( 0, channelIndex - 1, Brushes.DarkRed );
scModel.SendChannelCloseRequest( cardIndex, channelIndex );
};
}
}
还有我的 ChangeButton 状态
private void ChangeButtonState ( int cardIndex, int channelIndex, Brush brushToBeApplied)
{
switch ( cardIndex )
{
case 0:
ButtonStates0 [channelIndex] = brushToBeApplied;
break;
case 1:
buttonStates1 [channelIndex] = brushToBeApplied;
break;
case 2:
buttonStates2 [channelIndex] = brushToBeApplied;
break;
default:
break;
}
}
scModel 是我的 SerialCommunicationModel,我在其中操作数据以进行发送和接收。
我正在尝试发送相对于按钮状态发生变化的数据,例如,如果该通道没有活动通信,它将显示为红色,并且当单击它时,它将发送一条打开消息。同样,如果它已经有一个活动的通信,它将显示为绿色,并且当单击它时,它将发送一条关闭消息。
我可以更改第一次单击的背景,但之后我的代码无法按我想要的方式工作。我缺少什么以及如何在不复制粘贴相同代码的情况下实现这些按钮。预先感谢。
由于您想以 MVVM 方式实现,因此首先创建视图模型来表示应用程序的各个部分。您可以使用
ObservableObject
包中的 CommunityToolkit.Mvvm
类作为视图模型的基类。
然后为您的视图创建多个 WPF 资源字典。该文件将包含样式、数据模板以及在窗口上显示视图模型所需的其他 WPF 内容。使用
MergedDictionaries
属性将所有内容合并到 App.xaml 中,如 https://learn.microsoft.com/en-us/dotnet/api/system.windows.resourcedictionary.mergeddictionaries?view=windowsdesktop- 中的示例所示8.0
关于 WPF 的 UserControls...它们只是不必要的负担。不要使用它们。
在 MVVM 中,所有工作都在“视图模型”级别或更低级别完成。 视图通过绑定连接到视图模型。 视图模型无权访问视图上的控件,即使控件和视图不存在也应该可以工作(就像当您执行测试时,视图模型是可测试的)。