2012-01-12 38 views
1

私は最近WPFで作業しています。今、私は問題に直面しています。WPFのボタンの数を動的に制御

私は「追加」ボタンがありますが、これをクリックするたびにいくつかの内容の新しい行が追加されます。これらの内容はここ

    <TextBox Text="{Binding Name}" Margin="10,10" Height="20" ></TextBox> 
        <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox> 
        <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox> 
        <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox> 
        <Button Content="M1" Margin="10,10" Height="20"/> 
        <Button Content="M2" Margin="10,10" Height="20"/> 
        <Button Content="M3" Margin="10,10" Height="20"/> 
       </WrapPanel> 
      </Grid> 

below-示され、端部に三つのボタンM1、M2、M3があります。しかし、私は毎回この3つのボタンすべてを必要としません。私はM1またはM2だけ、またはM3またはM1、M2などしか必要ないかもしれません。

どうすればC#でこれを行うことができますか? 実際に私も知らない、私は正しい方法でいますか?

ありがとうございます。

答えて

2

私はObservableCollection<SomeObject>に私のXAMLを結合するであろう、とAddButtonをクリックするとObservableCollectionに新しいSomeObjectを追加する、と述べたWPF

で作業するとき、私は非常にMVVMデザインパターンに探してお勧めします。これにより、コレクションが更新されたときにUIが新しい行を自動的に追加するようになります。SomeObjectは、IsM1VisibleIsM2Visible、およびIsM3Visibleのプロパティが表示されます。

例えば、

クラスSomeObject

string Name; 
string City; 
int Age; 
int Count; 
bool IsM1Visible; 
bool IsM2Visible; 
bool IsM3Visible; 

XAMLは、このようなものになります必要があります:

<ItemsControl ItemsSource="{Binding SomeCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <WrapPanel> 
       <TextBox Text="{Binding Name}" Margin="10,10" Height="20" ></TextBox> 
       <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox> 
       <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox> 
       <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox> 
       <Button Content="M1" Visibility="{Binding IsM1Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/> 
       <Button Content="M2" Visibility="{Binding IsM2Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/> 
       <Button Content="M3" Visibility="{Binding IsM3Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/> 
      </WrapPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

をし、[追加]ボタンのClickイベントは、次のようなものになります。

void AddButton_Click(object sender, EventArgs e) 
{ 
    var newItem = new SomeItem 
     { 
      Name = "Something", 
      City = "Something", 
      Age = 30, 
      Count = 2, 
      IsM1Visible = true, 
      IsM2Visible = false, 
      IsM3Visible = true 
     }; 

    SomeCollection.Add(newItem); 
} 
+0

素晴らしい私はそれを探していた。 –

0

コードビハインドファイルにボタンを追加し、ボタンの周りにif構造体を配置するだけで、どのボタンを読み込むべきかを判断できます。

1

ボタンの量がリスト/コレクションのサイズに依存する場合は、DataBindingを使用できます。

<ItemsControl ItemsSource={Binding Ms}> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Content="{Binding Name}" Command={Binding ThingToDoWhenClickedCommand}/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl ItemsSource={Binding}> 

これは、DataContextにあるMsコレクション/リストにあるボタンの量を正確に生成します。

0

MVVMを使用していますか?

そうなら、これは簡単です。あなたのボタンの1つを表すButtonViewModelオブジェクトを作成し、それらのObservableCollectionをメインのViewModelから公開してください。

ビューには、ListView、またはコレクションにバインドされたItemsControl、ButtonViewModelをボタンに変えるDataTemplateがあります。

ユーザーが[追加]ボタンをクリックすると、コレクションに新しいButtonViewModelを追加すると、ビューは自動的に一致するように更新されます。

+0

いいえ、MVVMを使用していません。 –

0

まず、行のビューモデルを作成します。そのモデルでは、3つのboolプロパティ、IsButton1Visible、IsButton2Visible、IsButton3Visible、または行にバインドする必要があるすべてのプロパティを持つものがあります。 第2に、追加をクリックすると新しい行が追加されるというシナリオです。したがって、Row_View_Modelのリストがあります。 AddCommandでは、リストに新しいRow_View_Modelが表示されます。ここでは、表示するボタンを完全に制御できます。

関連する問題