如何在不复制粘贴的情况下实现多个具有相同行为的按钮? [已关闭]

问题描述 投票:0回答:1

我之前的问题不准确,我正在更新。

我有 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,我在其中操作数据以进行发送和接收。

我正在尝试发送相对于按钮状态发生变化的数据,例如,如果该通道没有活动通信,它将显示为红色,并且当单击它时,它将发送一条打开消息。同样,如果它已经有一个活动的通信,它将显示为绿色,并且当单击它时,它将发送一条关闭消息。

我可以更改第一次单击的背景,但之后我的代码无法按我想要的方式工作。我缺少什么以及如何在不复制粘贴相同代码的情况下实现这些按钮。预先感谢。

c# .net wpf mvvm wpf-controls
1个回答
-1
投票

由于您想以 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 中,所有工作都在“视图模型”级别或更低级别完成。 视图通过绑定连接到视图模型视图模型无权访问视图上的控件,即使控件和视图不存在也应该可以工作(就像当您执行测试时,视图模型是可测试的)。

© www.soinside.com 2019 - 2024. All rights reserved.