2

ボタンのデータ テンプレートを WPF XAML から C# コード IE に変更しようとしています。ボタンをプログラムで .cs ファイルに作成したいと考えています。

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 XPath=@Tag, Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding XPath=@Width}" Height="{Binding XPath=@Height}"/>
            </DataTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </ItemsControl.ItemContainerStyle>

</ItemsControl>

この線:

<Button Command="Open" Tag="{Binding XPath=@Tag, Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding XPath=@Width}" Height="{Binding XPath=@Height}"/>

すべてのボタンを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);
}

これは可能ですか?

4

1 に答える 1

0

動的ボタン自体を持つために C# は必要ありません。

私は動的ボタンを持つ実稼働中のアプリを持っています(さまざまなボタンをさらに追加するなど、すべてコードで行うことができ、それらはWPF UIに表示されるだけです)

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 にバインドすると、リストが適切に表示されます。

于 2012-06-21T20:43:32.260 に答える