2012-06-17 3 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> 

가 라인 :

<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 파일에 모든 버튼을 결합 곳

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

여기입니다 파일입니다

하지만 내가 원하는 것은 미리 정의 된 모든 바닥이있는 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#에 동적 단추가 필요하지 않습니다.

내가 동적 버튼이 생산에 응용 프로그램을 가지고 당신은 단지 ButtonViewModel 객체를 생성 할 필요가

을 (당신은 다른 버튼 등, 더 추가 코드를 모두 가질 수 있고 그들은 단지 WPF의 UI에 표시됩니다) 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); 

참고 : MVVM Base.zip

그런 다음 ItemsControl에를 사용하고 해당 ItemsSource 바인딩 : 현재 어떤 MVVM 프레임 워크 또는에서 RelayCommand를 얻을 수 있습니다 귀하의 buttonList 및 목록을 제대로 표시됩니다.

관련 문제