2017-09-14 55 views
1

所以,我希望標題不言自明,但一如既往,會更好地描述它。 我試圖把很多的複選框放入一個列表中,然後我可以使用它們的索引取消選中他們,當我有另一個檢查。在C#中創建WPF控件的列表/數組?

我的XAML的一個簡短的一部分,因爲它有點長,反覆多爲

<Expander Header="Tercer Ciclo" FontWeight="Bold" Width="auto" Height="auto"> 
       <StackPanel> 
        <Expander Header="9° Grado" Margin="20,0,0,0"> 
         <StackPanel> 
          <CheckBox x:Name="NovA" Margin="40,0,0,0" Content="Noveno A" /> 
          <CheckBox x:Name="NovB" Margin="40,0,0,0" Content="Noveno B" /> 
          <CheckBox x:Name="NovC" Margin="40,0,0,0" Content="Noveno C"/> 
          <CheckBox x:Name="NovD" Margin="40,0,0,0" Content="Noveno D"/> 
          <CheckBox x:Name="NovE" Margin="40,0,0,0" Content="Noveno E"/> 
         </StackPanel> 
        </Expander> 

這種結構只是重演另有7倍左右。事情是,當我選擇一個時,我想讓其他人取消選中。它並不會真正影響程序的正確功能,它只是更美觀並且定位用戶。

在你開始大聲說我應該使用這個或這個。我曾嘗試過:

  • 使用單選按鈕,但由於它是另一個列表中的列表,所以效果不佳。
  • 我搜索瞭如何創建一個列表來插入窗口的控件,並找到了一種答案,但它是爲WinForms的意思,我不知道如何在WPF做它,因爲它有不同的方法。
  • 試圖手動插入CheckBox的名稱,一個接一個......沒辦法,我正在完成;即使再foreach語法的控件...

我把這個作爲後面的代碼的參考: [Assign checkboxes to an checkbox-array using a for loop in C#]

我有這個已經,這是我看到的一個代碼幾乎正是我想要的,但同樣,意味着的WinForms所以foreach語法那種不適合WPF

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     List<CheckBox> listCheck = new List<CheckBox>(); 
     foreach (Control checkbox in //Invoke the window's Controls, don't know the syntaxis) 
     { 
      //Add the Checkbox's x:Name on the list... 


     } 
    } 

很抱歉,如果我發這個帖子這麼久了,但我一直CR我的頭在這附近數週了,並沒有發現我失蹤的東西的一些線索... 我很新的WPF和C#一般,所以是的,有點失落。

+7

使用MVVM與ItemsControl來做這種事情會更加快樂。 –

+0

如果您使用StackPanel的屬性名稱,則可以使用其子屬性來獲取所有控件。 – ganchito55

+0

互斥複選框:https://social.msdn.microsoft.com/Forums/vstudio/en-US/59a6e152-5652-4701-9b49-fa310d70c2bf/mutually-exclusive-checkboxes-in-wpf?forum=wpf – Gus

回答

1

您應該創建一個包含一個數據對象開始:

  • 的所有可用項目列表
  • 選定項的屬性

一旦你,你可以綁定那是爲了顯示一個項目列表,並處理一個選定項目的控件。一個ItemsControl很適合顯示項目,但不會跟蹤所選項目。一個ListBox都顯示項目列表,並跟蹤選定的項目,所以這就是我在這裏推薦的。

下面是我在過去用於使用的CheckBox在ListBox顯示項的例子。風格:

<Style x:Key="CheckBoxListBoxStyle" TargetType="{x:Type ListBox}"> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" /> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="{x:Type ListBoxItem}" > 
       <Setter Property="Margin" Value="2, 2, 2, 0" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <Border Background="Transparent"> 
           <CheckBox IsHitTestVisible="False" Focusable="false" 
            Content="{TemplateBinding ContentPresenter.Content}" 
            IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

因爲ListBoxItem.IsSelected勢必CheckBox.IsChecked,第二選擇不同的項目將取消一切其他因爲IsSelected=False所有其他記錄。

下面是用於實際顯示控制ListBox XAML:

<ListBox ItemsSource="{Binding ListOfAllItems}" 
     Style="{StaticResource CheckBoxListBoxStyle}" 
     SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 

注意,列表框背後的.DataContext應該是你創建的任何對象,有項目,所選項目的列表。如果你不清楚如何在WPF中使用DataContext,我建議從這裏開始:What is DataContext for?