2012-06-17 4 views
2

Я пытаюсь изменить шаблон данных кнопок из WPF XAML в код C# I.E. Я хочу создать кнопки программно в файле .cs.Изменить XAML на код C#

Часть XAML выглядит следующим образом:

<ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Name="buttons" Margin="0"> 

    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <local:FishEyePanel ScaleToFit="false"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="{x:Type ContentPresenter}"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
      <DataTemplate> 
       <Button Command="Open" Tag="{Binding [email protected], Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding [email protected]}" Height="{Binding [email protected]}"/> 
      </DataTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 

</ItemsControl> 

Линия:

<Button Command="Open" Tag="{Binding [email protected], Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding [email protected]}" Height="{Binding [email protected]}"/> 

где я связываю все кнопки в файл XML, вот файл:

<XmlDataProvider x:Key="Things" XPath="Things/Thing"> 
    <x:XData> 
     <Things xmlns=""> 
     <Thing Button="uno1" Tag="abc" Width="200" Height="200"/> 
     </Things> 
    </x:XData> 
</XmlDataProvider> 

Но я хочу вместо того, чтобы вызывать файл xml со всеми предопределенными основаниями, вызвать метод в cs с помощью кнопок, что-то вроде это:

public void createButtons() 
{ 
    Button button = new Button(); 
    button.Tag = "I am from cs"; 
    buttons.Items.Add(button); 
} 

Возможно ли это?

+0

Что именно не работает в нашем методе 'createButtons()'? В общем, все, что возможно в XAML, также возможно в коде C#. –

+0

Почему вы хотите это сделать? что плохого в использовании XAML? –

+0

Да, это возможно. Что вы пробовали? Если есть смысл в кодировании, что вы повесили трубку, спросите об этом. Если вам нужно что-то начать, посмотрите на 'buttons.ItemContainerStyle' и' buttons.ItemsPanel', посмотрите их типы и оттуда. Для меня это не слишком важно, почему вы хотите сделать это в первую очередь. Если вы объясните, почему вы хотите это сделать, кто-то может предложить лучший подход. –

ответ

0

Вам не нужен C#, чтобы иметь динамические кнопки как таковые.

У меня есть приложение в производстве, что имеет динамические кнопки (вы можете иметь различные кнопки добавить больше, и т.д., все в коде, и они просто отображаются в пользовательском интерфейсе WPF)

Вам просто нужно создать объект ButtonViewModel а затем поместите в свой код список ButtonViewModel.

using System; 
using System.Windows.Input; 
using Setup.Common; 

namespace ExampleOfButtonList 
{ 
    public class ButtonViewModel : ViewModelBase 
    { 
     #region Member fields 
     protected bool _IsVisible; 
     protected bool _IsEnabled; 
     protected RelayCommand _ButtonCommand; 
     protected String _Text; 
     #endregion 

     #region Constructors 
     /// <summary> 
     /// The default constructor 
     /// </summary> 
     public ButtonViewModel() 
     { 
     } 
     #endregion 

     #region Properties 
     public virtual ICommand ButtonCommand 
     { 
      get { return _ButtonCommand; } 
      set 
      { 
       _ButtonCommand = value as RelayCommand; 
       NotifyPropertyChanged("ButtonCommand"); 
      } 
     } 

     public bool IsVisible 
     { 
      get { return _IsVisible; } 
      set 
      { 
       _IsVisible = value; 
       NotifyPropertyChanged("IsVisible"); 
      } 
     } 

     public String Text 
     { 
      get { return _Text; } 
      set 
      { 
       _Text = value; 
       NotifyPropertyChanged("Text"); 
      } 
     } 
     #endregion 
    } 
} 

Создать список, как это в вашем коде:

List<ButtonViewModel> buttonList = new List<ButtonViewModel>(); 
ButtonViewModel bvm1 = new ButtonViewModel(); 
bvm.ButtonCommand = new RelayCommand(f => SomeMethod()); 
buttonList.add(bvm1); 

Примечание: Вы можете получить RelayCommand от любых рамок MVVM или здесь: MVVM Base.zip

Затем с помощью ItemsControl и связать его ItemsSource к ваш buttonList, и он будет правильно отображать список.

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