2010-01-07 13 views
1

Je suis coincé à la partie où je dois lier une collection à un contrôle utilisateur dynamique. Le scénario est quelque chose comme ça. J'ai un contrôle dynamique, ayant un expander, datagrid, combobox et textbox, où combox et textbox sont à l'intérieur de datagrid. Il y a déjà deux collections avec eux. L'un est lié avec combobox et l'autre est lié avec datagrid. Lorsque l'élément est modifié en combox, sa valeur respective est définie sur sa zone de texte respective, et ainsi de suite. et cette paire de valeur est ensuite définie sur la collection liée à DataGrid. Un utilisateur peut ajouter plusieurs éléments.Comment lier une collection observable à plusieurs contrôles utilisateur au moment de l'exécution?

Maintenant, le problème principal est que toutes ces choses se passent à l'intérieur d'un contrôle utilisateur qui est ajouté de manière dynamique, c'est-à-dire sur un événement de clic sur un bouton. Un utilisateur peut ajouter les nombres souhaités de contrôles utilisateur au formulaire. problème vient dans cette situtaion. Dites que j'ai ajouté 3 contrôles. Maintenant dans le premier si j'ajoute un code à la collection alors il se reflète dans les deux contrôles suivants, car ils sont liés à la même collection. Donc, je veux savoir est de toute façon de regénérer/renommer la même collection de sorte que la condition ci-dessus ne devrait pas survenir.

+0

Pourquoi est-ce wiki communautaire? – Arcturus

Répondre

3

Il est difficile de répondre à votre question sans voir l'image plus grande, mais j'ai le sentiment que vous allez à ce sujet dans le mauvais sens. Il semble que vous ajoutiez des instances de votre contrôle utilisateur directement à partir du code. Au lieu de faire cela, vous devez créer une sorte de ItemsControl dans votre XAML, et dans son ItemTemplate avoir votre contrôle utilisateur. Liez cette ItemsControl à une collection dans votre modèle de vue et manipulez uniquement cette collection.

Vous ne devriez pas faire référence à des contrôles visuels dans votre modèle de vue ou code derrière. Chaque fois que vous vous trouvez référencement des éléments visuels directement à partir du code, il devrait soulever un drapeau d'avertissement dans votre esprit « Hey Il y a une meilleure façon que ça! » ...

Exemple:

Le modèle de vue:

public class ViewModel 
{ 
    public ObservableCollection<MyDataObject> MyDataObjects { get; set; } 

    public ViewModel() 
    { 
     MyDataObjects = new ObservableCollection<MyDataObject> 
     { 
      new MyDataObject { Name="Name1", Value="Value1" }, 
      new MyDataObject { Name="Name2", Value="Value2" } 
     }; 
    } 
} 

public class MyDataObject 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

le fragment XAML de la fenêtre contenant la liste et le modèle de données:

<Window.Resources> 
    ... 
    <DataTemplate x:Key="MyDataTemplate"> 
     <local:MyUserControl/> 
    </DataTemplate> 
</Window.Resources> 
... 
<ListBox ItemsSource="{Binding MyDataObjects}" 
     ItemTemplate="{StaticResource MyDataTemplate}" 
     HorizontalContentAlignment="Stretch"/> 

le contrôle de l'utilisateur:

<UniformGrid Rows="1"> 
    <TextBlock Text="{Binding Name}"/> 
    <TextBlock Text="{Binding Value}" HorizontalAlignment="Right"/> 
</UniformGrid> 
+0

Oui, true, j'ajoute une instance de UserControl. Parce qu'un utilisateur peut ajouter/supprimer le nombre de contrôles usuels souhaité. Plus d'aide sur l'utilisation de ItemTemplate/ItemsControl pour plusieurs contrôles utilisateur. Ce serait une grande aide –

+0

J'ai donné 1 pour me montrer une autre façon. Merci Aviad –

+0

Je dois quitter l'ordinateur pour le moment - Si aucune meilleure réponse se présente au moment où je reviens, je vais donner un exemple. –