2010-10-19 5 views
0

J'ai cette exigence où: Par exemple, un bloc de texte a un nom affiché comme "Nom, Prénom" qui, au clic, chargera deux contrôles de zone de texte avec la valeur de Firstname chargée dans sa propre boîte et la valeur de son nom dans sa propre boîte et les garder prêts pour l'édition. Bien que je puisse facilement écrire un tas de conditions if dans mon code-behind pour y parvenir, je cherche de meilleurs moyens d'éviter une telle solution car il n'y a pas de traitement WPFism ou MVVM. De plus, il y a un tas d'autres contrôles dans mon écran qui auront besoin de ce genre de comportement et le code peut vite devenir moche si je recourt à la manière initiale de le résoudre en changeant juste la visibilité. Y a-t-il une meilleure façon de résoudre cela dans WPF? Serais-je en mesure de regrouper ces contrôles dans un contrôle personnalisé et définir mon modèle de contrôle (mais cela signifierait que je devrais rouler de telles choses pour tous les contrôles de mon écran.)WPF - Comment charger du texte dans un bloc de texte en plusieurs contrôles au clic

génial.

Merci Bala

Répondre

0

On dirait que vous voulez entrer dans le monde merveilleux de DataTemplates

d'abord, nous allons créer une classe conteneur pour vos données

public class Person 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public Person(string first, string last) 
    { 
     FirstName = first; 
     LastName = first; 
    } 
} 

Ensuite, dans le code derrière votre élément d'hébergement (probablement une fenêtre). Vous pouvez déclarer et ObservableCollection<> des objets.

//populate me wherever! 
public ObservableCollection<Person> People {get;set;} 

(ne pas oublier d'initialiser que quelque part pour éviter toutes sortes d'exceptions inutiles)

Ensuite, vous pouvez lier la collection à une collection d'articles, j'aime la ItemsControl

<ItemsControl ItemsSource="{Binding Path=People}"/> 

Sauf ce ne donne pas le résultat que nous voulons. Donc, bien que nous puissions remplacer le ToString() de notre classe pour cracher des données formatées, nous pouvons faire mieux en remplaçant le modèle d'élément du contrôle des éléments.

<ItemsControl ItemsSource="{Binding Path=People}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button DataContext="{Binding}" Click="Button_Click"> 
        <Button.Content> 
         <TextBlock> 
          <TextBlock.Text> 
           <MultiBinding StringFormat="{}{1}, {0}"> 
            <Binding Path="FirstName"/> 
            <Binding Path="LastName"/> 
           </MultiBinding> 
          </TextBlock.Text> 
         </TextBlock> 
        </Button.Content> 
       </Button> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

Notez que j'utilise une multi-liaison avec un formateur de chaîne afin de formater le texte correctement sur les boutons.

Maintenant sur les boutons Click Gestionnaire d'événements, vous pouvez traiter un élément. Comme le Sender de l'événement sera le bouton, et le DataContext du bouton sera l'objet personne qu'il représente et vous pouvez faire ce que vous souhaitez.

Vous pouvez également trouver le ListBox et sa propriété SelectedItem très utile dans votre cas particulier.

Espérons que cela soit suffisant pour vous aider à démarrer, -Val

+0

Bonjour, Merci d'avoir pris le temps de répondre. Laissez-moi essayer cela et modifier cela pour répondre à mes exigences et revenir avec d'autres commentaires/mises à jour. Merci encore. Vous tiendrons au courant. – Bala

+0

Pas de soucis. et bonne chance! – Val

Questions connexes