2010-05-06 5 views
0

J'apprends actuellement à créer des contrôles personnalisés dans WPF. J'ai réussi à créer un contrôle personnalisé simple en utilisant une étiquette et une zone de texte. J'ai été en mesure d'autoriser la définition du texte Label par DependencyProperty.Ajout de ComboBoxItem à une zone de liste déroulante dans un contrôle utilisateur (XAML/WPF)

Maintenant, je crée un contrôle utilisateur qui a un ComboBox. Je dois autoriser l'ajout d'éléments à ce ComboBox depuis l'extérieur du contrôle. Pour ce faire, j'ai essayé d'exposer une DependencyProperty de type ItemsCollection et cela permettra d'accéder à la propriété Items de ComboBox (le DP dans mon exemple de contrôle est nommé 'CbItems'). Mais j'obtiens des erreurs parce que la propriété Items de Combobox est ReadOnly.

contrôle XAML

<UserControl x:Class="MyWpfApp.Controls.MyControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="Auto" Width="Auto"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Column="0" Content="{Binding FieldLabel}"></Label>  
     <ComboBox Name="cmb" Grid.Column="1" Width="150"></ComboBox> 
    </Grid> 
</UserControl> 

MainWindow XAML

<Window x:Class="MyWpfApp.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ctl="clr-namespace:MyWpfApp.Controls" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <ctl:MyControl> 
      <ctl:MyControl.CbItems> 
       <ComboBoxItem>Hello</ComboBoxItem> 
       <ComboBoxItem>World</ComboBoxItem> 
       <ComboBoxItem>Hi</ComboBoxItem> 
      </ctl:LobCombox.CbItems> 
     </ctl:LobCombox> 
    </Grid> 
</Window> 

Je voudrais savoir quelle est la bonne façon est d'obtenir cette fonctionnalité. Je crois que la réponse à cette question pourrait aussi aider à d'autres contrôles tels que GridView etc

Merci beaucoup

Répondre

2

This great article de Dr. WPF contient toutes les informations dont vous aurez besoin, et une explication approfondie de toutes les options que vous pouvez utiliser.

+0

Merci pour le lien. J'ai résolu le problème en utilisant CollectionViewSource. – byte

2

WPF réalise généralement beaucoup de choses grâce à la liaison; c'est un changement de paradigme auquel il faut s'habituer. Voici un exemple rapide du code de travail:

Window1.xaml

<Window 
x:Class="ComboBoxSpike.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" 
Height="300" 
Width="300"> 
<StackPanel> 
    <ComboBox 
     ItemsSource="{Binding ComboBoxItems}" /> 
    <Button 
     x:Name="AddToComboBox" 
     Content="Add an item to combo box" 
     Click="AddToComboBox_Click" /> 
</StackPanel> 
</Window> 

Window1.xaml.cs

public partial class Window1 : Window 
{ 
    private ViewModel _viewModel; 
    public static int Counter; 

    public Window1() 
    { 
     InitializeComponent(); 
     _viewModel = new ViewModel(); 
     this.DataContext = _viewModel; 
    } 

    private void AddToComboBox_Click(object sender, RoutedEventArgs e) 
    { 
     _viewModel.ComboBoxItems.Add("ComboBoxItem" + Counter); 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     this.ComboBoxItems = new ObservableCollection<string>(); 
    } 

    public ObservableCollection<string> ComboBoxItems { get; set; } 


    } 

L'idée est que vos articles ComboBox sont liés à une collection de chaînes (ou n'importe quel objet d'ailleurs, vous pouvez changer l'apparence d'entre eux avec des datatemplates). Vous ne modifiez pas le ComboBox lui-même, mais la collection d'éléments à laquelle il est lié.

+0

Merci David pour le point de vue de MVVM. J'ai résolu mon problème en utilisant CollectionViewSource de l'article mentionné ci-dessous par Charlie et quelques autres informations en ligne sur l'utilisation de CollectionViewSource. J'ai upvoted votre réponse. – byte

Questions connexes