首页 > 解决方案 > 使用 WPF 减少重复

问题描述

我有这个代码截图

DockPanel Margin="3" 
       HorizontalAlignment="Stretch"  >
<Label
    Content="Port #1" 
    DockPanel.Dock="Left"/>
<ComboBox     
    x:Name="Port1"
    ItemsSource="{Binding PortList}"
    SelectedItem="{Binding Port1Selected}">                             
</ComboBox>
</DockPanel>

<DockPanel  Margin="3"
        HorizontalAlignment="Stretch"  >
<Label
    Content="Port #2" 
    DockPanel.Dock="Left"/>
<ComboBox                                 
   ItemsSource="{Binding PortList}"
    SelectedItem="{Binding Port2Selected}"/>
</DockPanel>

如您所见,除了属性DockPanels之外,还有两个基本相同。SelectedItem

目前我有 8 个我复制的,但似乎复制和粘贴太多,容易出错,将来我可能会有更多端口,所以我需要创建一个新的 DockPanel.

甚至有更复杂的控制,我需要“复制”。

我试图让自定义控件包含<DockPanel> /// </DockPanel >部分,但我不知道要实现相同的功能并具有相同的绑定

我的问题是,我如何在没有声誉的情况下实现这一目标。

我在这里 和这里寻找一些想法的棱镜示例

更新

我的项目控制器

<ItemsControl ItemsSource="{Binding PortList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <DockPanel HorizontalAlignment="Stretch" 
           Margin="3">
                <Label
                    Content="{Binding PortName}" 
                    DockPanel.Dock="Left"/>
                     <ComboBox                                 
                        ItemsSource="{Binding PortList}"
                        SelectedItem="{Binding SelectedPort}"/>
            </DockPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我的端口模型

    public class PortModel : BindableBase
    {
        public string  PortName { get; set; }
        public List<string> PortList { get; set; }
       // public string SelectedPort { get; set; }

        private string _selectedPort;
        public string SelectedPort
        {
            get { return _selectedPort; }
            set { SetProperty(ref _selectedPort, value); }
        }
    }

和我在视图模型中的主要列表#region List Properties

    private ObservableCollection<PortModel> portsList;
    public ObservableCollection<PortModel> PortList
    {
        get { return portsList; }
        set { SetProperty(ref portsList, value); }
    }

并将项目添加到列表中

private void LoadSerialPorts()
{
    portsList.Clear();            

    for (int i = 0; i < Constants.NUMBER_OF_COMS; i++)
    {
        PortList.Add(new PortModel
        {
            PortList = serialPortHandler.GetSerialPortPort().ToList(),
            PortName = $"Port #{i}",
        });
        
    }
   
} 

但现在选定的端口不会触发

标签: c#wpfcontrols

解决方案


推荐阅读