2012-10-25 4 views
0

Я разработчик C++ и недавно перешел на wpf. Кажется, у меня сложная ситуация, когда мне приходится динамически генерировать ярлыки, основанные на щелчке мышью. Здесь я покажу вам, как я сначала сгенерировал 4 переключателя.Динамическое создание ярлыков При нажатии динамически созданного RadioButton в WPF

XAML:

<Grid Grid.Row="0">   

     <ItemsControl ItemsSource="{Binding Children}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Vertical" 
        IsItemsHost="True" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 

      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <RadioButton Content="{Binding RadioBase}" Margin="0,10,0,0" IsChecked="{Binding BaseCheck}" Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl>   

    </Grid> 

<Grid Grid.Row="1"> 
    <Label Content="{Binding name}" HorizontalAlignment="Center" VerticalAlignment="Center" />  
</Grid> 

ViewModel:

private bool sBaseCheck; 
    public bool BaseCheck 
    { 
     get { return this.sBaseCheck; } 
     set 
     { 
      this.sBaseCheck = value;     
      this.OnPropertyChanged("BaseCheck"); 
     } 
    } 

    private int _ID; 
    public int ID 
    { 
     get 
     { 
      return _ID; 
     } 

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

    private string _NAme; 
    public string name 
    { 
     get 
     { 
      return _NAme; 
     } 

     set 
     { 
      _NAme= value; 
      OnPropertyChanged("name"); 
     } 
    } 

    private string _RadioBase; 
    public string RadioBase 
    { 
     get 
     { 
      return _RadioBase; 
     } 

     set 
     { 
      _RadioBase = value; 
      OnPropertyChanged("RadioBase"); 
     } 
    } 

AnotherViewModel Класс:

public ObservableCollection<FPGAViewModel> Children { get; set; } 

    public FPGARadioWidgetViewModel() 
    { 
     Children = new ObservableCollection<FPGAViewModel>(); 
     Children.Add(new FPGAViewModel() { RadioBase = "Base 0x0", ID = 0 }); 
     Children.Add(new FPGAViewModel() { RadioBase = "Base 0x40", ID = 1 }); 
     Children.Add(new FPGAViewModel() { RadioBase = "Base 0x80", ID = 2 }); 
     Children.Add(new FPGAViewModel() { RadioBase = "Base 0xc0", ID = 3 });    
    } 

Это дает мне 4 радиокнопки с содержанием, как указано выше. Теперь я хочу сгенерировать 8 меток на каждом щелчке радиатора. Я сделал это в моем приложении C++ следующим образом:

for(i = 0; i < 0x40/8; i++) 
{ 
    reg = (i * 8); 
    m_registerLabel[i] = new Label(String::empty, String("Reg 0x") + String::toHexString(reg)); 
    addAndMakeVisible(m_registerLabel[i]); 
} 

, если вы заметили, он будет создавать 8 этикетки со значением, как Reg 0x0, Reg 0x8, Reg 0x10, Reg 0x18 и т.д., так как р преобразуется в шестнадцатеричный. Я хочу создать что-то подобное, когда я нажимаю Base 0x0 при запуске.

Как я могу достичь этого в своем приложении ???

+0

Я думаю, что эта ссылка [Программное Добавление элементов управления в WPF Форму] [1] [1]: http://stackoverflow.com/questions/2814866/programmatically-add-controls-to -wpf-form поможет вам .. –

+0

@RahulRanjan: Не совсем. Я следую за шаблоном MVVM. – StonedJesus

ответ

0

В вашем сетевом устройстве this.sBaseCheck вы можете сделать этот код.

private bool sBaseCheck; 
public bool BaseCheck 
{ 
    get { return this.sBaseCheck; } 
    set 
    { 
     this.sBaseCheck = value;     
     Generatelabels(this) 
     this.OnPropertyChanged("BaseCheck"); 
    } 
} 

Добавить 2 новые свойства ...

private string[] registerLabels = new string[8]; 
    public string[] RegisterLabels { get { return registerLabels; } } 

    private bool isRegisterItemsVisible = false; 
    public bool IsRegisterItemsVisible { 
     get { return isRegisterItemsVisible ; } 
     set { 
      isRegisterItemsVisible = value; 
      OnPropertyChanged("IsRegisterItemsVisible"); 
      OnPropertyChanged("RegisterLabels"); 
     } 
    } 

занесения эти значения ...

private static void Generatelabels(FPGAViewModel currentItem) 
{ 
    for(i = 0; i < 0x40/8; i++) 
    { 
     reg = (i * 8); 
     currentItem.RegisterLabels[i] = "Reg 0x" + String::toHexString(reg); 
     currentItem.IsRegisterItemsVisible = true; 
    } 
} 

На вашем GUI, связать их с другим ItemsControl в ItemTemplate существующего ItemsControl.

 <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <RadioButton 
         Content="{Binding RadioBase}" 
         Margin="0,10,0,0" 
         IsChecked="{Binding BaseCheck}" 
         Height="15" Width="80" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Center"/> 
        <ItemsControl 
          Visibility="{Binding IsRegisterItemsVisible, 
           Converter={StaticResource BoolToVisibilityConv}}" 
          ItemsSource="{Binding RegisterLabels}"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
          <TextBlock Text="{Binding}"/> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
+0

Спасибо за ответ. Он выдает ошибку в 'currentItem.RegisterLabel [i] = String (« Reg 0x ») + String :: toHexString (reg);' as 'ViewModel не содержит определения для RegisterLabel.' И в' String', поскольку 'string - это тип но используется как переменная. – StonedJesus

+0

Обновлено. Plz предполагают это как psedocode, поскольку я не разработчик C++. –

+0

Спасибо, брал ..... Я удалил все ошибки, но приложение рушится, и оно выдает следующее: «Предоставить значение в« System.Windows.Markup.StaticResourceHolder »выбрал исключение». Я предполагаю, что что-то не так с xaml – StonedJesus

Смежные вопросы