2012-01-12 2 views
1

저는 최근에 WPF로 작업하고 있습니다. 이제, 나는 문제에 직면하고있다.WPF의 버튼 수를 동적으로 제어

"추가"버튼이 있습니다.이 버튼을 클릭 할 때마다 일부 내용이있는 새 행이 추가됩니다. 그 내용은 세 개의 버튼 M1, M2, M3가있다 끝에 여기

    <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 또는 M1, M2 등만 필요할 수도 있습니다.

어떻게 C#에서이 작업을 수행 할 수 있습니까? 실제로 나는 심지어 모른다, 나는 바른 길에있다?

미리 감사드립니다.

답변

2

, 나는 ObservableCollection<SomeObject> 내 XAML을 결합하는 것, 그리고 AddButton을 클릭하면 ObservableCollection에 새 SomeObject을 추가합니다. 이렇게하면 컬렉션이 업데이트 될 때 UI가 자동으로 새 행을 추가하게되고 SomeObjectIsM1Visible, IsM2VisibleIsM3Visible에 대한 속성이 표시되어 표시 될 버튼을 결정할 수 있습니다.다음과 같이 보일 것이다

<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 이벤트 : 예를 들어

,

클래스 SomeObject

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

는 XAML은 다음과 같이 보일 것이다 것

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을 사용하고 있습니까?

그렇다면 이것은 쉽습니다. 단추 중 하나를 나타내는 ButtonViewModel 개체를 만들고 주 ViewModel에서 ObservableCollection을 노출하십시오.

보기에는 ListView 만 있거나 컬렉션에 바인딩 된 ItemsControl과 ButtonViewModel을 단추로 바꾸는 DataTemplate이 있습니다.

사용자가 [추가] 버튼을 클릭하면 컬렉션에 새 ButtonViewModel을 추가하면보기가 자동으로 일치하도록 업데이트됩니다.

+0

아니요, MVVM을 사용하고 있지 않습니다. –

0

먼저 행에 대한 뷰 모델을 만듭니다. 이 모델에서는 3 개의 bool 속성 인 IsButton1Visible, IsButton2Visible, IsButton3Visible 또는 행에 바인딩을 수행해야하는 모든 속성을 가진 항목이 있습니다. 둘째, 추가를 클릭하면 새 행이 추가됩니다. 그래서 당신은 Row_View_Model의 목록을 가지고 있습니다. AddCommand에서는 목록에 새로운 Row_View_Model이 표시됩니다. 여기에 표시 할 단추를 완전히 제어 할 수 있습니다. 말했다 WPF

작업 할 때 나는 높은 MVVM 디자인 패턴을 조사하는 것이 좋습니다 것