如何在两个动态生成的组合框上使用不同的值

Posted

技术标签:

【中文标题】如何在两个动态生成的组合框上使用不同的值【英文标题】:How to use different values on two Dynamically generated Comboboxes 【发布时间】:2012-10-19 06:34:05 【问题描述】:

我是一名 C++ 开发人员,最近开始研究 WPF。我很抱歉这个奇怪的标题,因为我不知道该放什么。在我的应用程序中,我需要动态生成 2 个包含按钮、标签、文本框、组合框等的组合框。一旦完成,我需要对这些控件执行一些操作。

我有 2 个 xaml 文件 PCMGenView.xamlPCMGenWidgetView.xaml 其中 PCMGenWidgetView.xaml 文件具有组框并添加到 PCMGenView.xaml 文件中。我还有 2 个视图模型类和一个模型类。好吧,让我告诉你我是怎么做到的:

PCMGenView.xaml

<UserControl.Resources>
    <DataTemplate x:Key="PGenDataTemplate">
        <WrapPanel>
            <TextBlock Text="Binding Description" Margin="5,5,0,0"/>
            <local:PCMGenWidgetView Margin="5,10,5,5"/>
        </WrapPanel>
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <ItemsControl ItemTemplate="StaticResource PGenDataTemplate" ItemsSource="Binding PGenWidgets">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

PCMGenWidgetView.xaml:

<Grid>
    <GroupBox Height="Auto" HorizontalAlignment="Stretch" Margin="10" Name="groupBox1" VerticalAlignment="Stretch" Width="Auto">
        <Grid >
              <ComboBox Grid.Column="1" ItemsSource="Binding PreScalarList" SelectedItem="Binding SelectedPreScalarList, Mode=OneWayToSource" SelectedIndex="0" Height="23" HorizontalAlignment="Center" Margin="0,0,0,0" Name="PCMGenControlCombo" VerticalAlignment="Center" Width="110" /> 
              // Radio Button, Buttons etc are present too                          
        </Grid>
    </GroupBox>
</Grid>

PCMGenWidgetView.xaml.cs:

public partial class PCMGenWidgetView : UserControl

    PCMGenWidgetViewModel mPCMGenWidgetViewModel = new PCMGenWidgetViewModel();

    public PCMGenWidgetView()
    
        InitializeComponent();
        this.DataContext = mPCMGenWidgetViewModel;            
    

PCMGenViewModel:

public ObservableCollection<PCMGenWidgetViewModel> PGenWidgets  get; set; 

    public PCMGenViewModel()
    
        PGenWidgets = new ObservableCollection<PCMGenWidgetViewModel>();
        PGenWidgets.Add(new PCMGenWidgetViewModel  Description = "PCM Generator 1", ID = 0 );
        PGenWidgets.Add(new PCMGenWidgetViewModel  Description = "PCM Generator 2", ID = 1 );            
    

PCMGenWidgetViewModel:

private string _description;
    public string Description
    
        get
        
            return _description;
        

        set
        
            _description = value;
            OnPropertyChanged("Description");
        
    

public ObservableCollection<string> PreScalarList
    
        get  return _PreScalarList; 
        set
        
            _PreScalarList = value;
            OnPropertyChanged("PreScalarList");
        
    

    private string _selectedPreScalarList;
    public string SelectedPreScalarList
    
        get  return _selectedPreScalarList; 
        set
        
            _selectedPreScalarList = value;
            int Listvalue = PreScalarList.IndexOf(_selectedPreScalarList);
            int ListFinalVal = Listvalue + 1;
            SelectedPreScalar(ListFinalVal);
            OnPropertyChanged("SelectedPreScalarList");
        
    

    private int _ID;
    public int ID
    
        get
        
            return _ID;
        

        set
        
            _ID = value;
            OnPropertyChanged("ID");
        
    

    public void SelectedPreScalar(int Select)
    
        int bitMask;
        bitMask = (0 == ID) ? 0xCF : 0x3F;  // ID always shows 0
        m_controlRegs[0] &= Convert.ToByte(bitMask);
        //m_refClock[0] = Convert.ToByte(18432000 * 2);                                             
    

现在这在启动时给了我 2 个组合框 :) 在我的组合框中,我有 A,B,C,D 作为项目。查看组合框绑定,了解如何从组合框中检索所选值。在这里,我想对所有这些控件执行相同的操作,但如果值不同。好吧,我的意思是说我在我的 C++ 应用程序中所做的这样的事情:

for( i = 0;  i < 2; i++) //Constructor: Here 2 is used because we have 2 groupboxes

    m_pcmGenPrescalar[i] = new ComboBox(String::empty);
    m_pcmGenPrescalar[i]->addItem(String(T("div 1")), 1);
    m_pcmGenPrescalar[i]->addItem(String(T("div 15")), 2);
    m_pcmGenPrescalar[i]->addItem(String(T("div 255")), 3);
    m_pcmGenPrescalar[i]->addItem(String(T("div 65535")), 4);
    m_pcmGenPrescalar[i]->setEditableText(false);
    m_pcmGenPrescalar[i]->setSelectedId(1, true);
    m_pcmGenPrescalar[i]->addListener(this);
    addAndMakeVisible(m_pcmGenPrescalar[i]);


for( i = 0;  i < 2; i++) //Here 2 is used because we have 2 groupboxes
       
    if(m_pcmGenPrescalar[i] == comboBox) //PreScalar Combobox
    
        unsigned char bitMask = (0 == i) ? 0xCF : 0x3F; Takes the value of i
        m_controlRegs[0] &= bitMask;
        m_refClock[i] = 18432000 * 2;
    

如果您注意到上面的代码,您会发现 for loop 创建了两次组合框,并且基于哪个组合框被选中,i 中的值被获取。 IE。如果第一个组合框选择被更改,则 unsigned char bitMask = (0 == i) ? 0xCF : 0x3F; 变为 unsigned char bitMask = (0 == 0) ? 0xCF : 0x3F; 如果第二个则,unsigned char bitMask = (0 == 1) ? 0xCF : 0x3F;

这是我的查询。我怎样才能知道我使用了哪个组合框。我使用的是 PCM Gen 1 组合还是 PCM Gen 2 组合?这对我来说是一个棘手的情况。请帮忙:)

【问题讨论】:

【参考方案1】:

使用 ID 属性:

    public int ID get;set;
    public void SelectedPreScalar(int Select)
    
        int bitMask;
        bitMask = (0 == ID) ? 0xCF : 0x3F; 
        m_controlRegs[0] &= Convert.ToByte(bitMask);
        m_refClock[0] = Convert.ToByte(18432000 * 2); 
    

但您也可以使用在实例化时设置的 BitMask-Property:

    public string BitMask get;set;
    public void SelectedPreScalar(int Select)
    
        m_controlRegs[0] &= Convert.ToByte(BitMask);
        m_refClock[0] = Convert.ToByte(18432000 * 2); 
    

根据您的决定,您的 PCGenViewModel 构造函数可能如下所示:

    public PCMGenViewModel()
    
        PGenWidgets = new ObservableCollection<PCMGenWidgetViewModel>();
        PGenWidgets.Add(new PCMGenWidgetViewModel  Description = "PCM Generator 1", BitMask="0xCF" );
        PGenWidgets.Add(new PCMGenWidgetViewModel  Description = "PCM Generator 2", BitMask="0x3F" );            
    

    public PCMGenViewModel()
    
        PGenWidgets = new ObservableCollection<PCMGenWidgetViewModel>();
        PGenWidgets.Add(new PCMGenWidgetViewModel  Description = "PCM Generator 1", ID=0 );
        PGenWidgets.Add(new PCMGenWidgetViewModel  Description = "PCM Generator 2", ID=1 );            
    

我建议使用第二个建议,因为如果您添加第三个分组框,则不必更改 SelectedPreScalar 方法。

【讨论】:

感谢您的回复。但是你明白我要解释的吗???我已经生成了 2 个具有组合框的组框。我只想知道我使用了哪个组合框。 PCm Gen 1 或 PCM Gen 2。它们在bitMaskcontrolRegs 等中都有不同的值。我的查询很简单。如何确保动态生成的组合框彼此独立?我们可以使用一个 ID 来返回我使用的 PCM Gen 吗? 您想在哪里知道您使用了哪个 ComboBox?在你的 PCMGenWidgetViewModel 的SelectedPreScalar-method 中?是的,那么您可以轻松使用 ID 属性。 是的。 SelectedPreScalar 是我的 PCMGenWidgetViewModel 类的一部分。由于它在组合框更改时拥有控件,我需要知道如何使用 ID 来实现它?当我说 ID 时,我的意思是为 PCMGen 1 设置 ID = 0,为 PCMGen2 设置 ID = 1,每当我在任何 PCMGen 中更改组合框项目时,我都会知道我选择了哪个。你能帮我实现这个吗? :) 很好地尝试了 ID 方法,每当我选择任何组合框时,ID 值始终为 0。 您必须在创建 PCMGenWidgetViewModel 实例时设置 ID(我的答案中的最后一个代码块),否则它始终为 0(int 变量的默认值)。

以上是关于如何在两个动态生成的组合框上使用不同的值的主要内容,如果未能解决你的问题,请参考以下文章

根据使用 Javascript 选择的组合框动态添加表单字段

如何动态组合生成器?

如何同步组合框和文本字段值。即如何从存储在文本字段中加载不同的值,而我正在更改组合框上的值

wpf如何根据输入信息动态生成treeview

Oracle 12c - 根据不同表中的值动态生成 where 子句

Postman内置的动态变量