2010-08-17 9 views
0

J'ai une application WPF avec une listbox et un contentcontrol. Le contenu contentcontrol est lié à la zone de liste et possède un datatemplate qui affiche une zone de texte dont le contenu est lié à une variable de l'élément sélectionné dans ladite zone de liste. Jusqu'à présent, tout fonctionne bien, c'est-à-dire que lorsque je sélectionne un élément de la liste, le contenu de la zone de texte passe à la valeur actuelle de la variable. Cependant, si au moment de l'exécution je change la valeur de la variable, la zone de texte n'est pas mise à jour sauf si je sélectionne un autre élément de la liste, puis sélectionne à nouveau l'élément d'origine. Des idées sur ce que je fais mal ou ce qui me manque ici? Je pensais que la valeur de la zone de texte changerait automatiquement? Votre aide est tres apprecie.WPF mise à jour de l'interface utilisateur lors de la modification de la source de liaison

est ici l'exemple (MainWindow.xaml)

<Grid> 
    <ListBox Height="100" HorizontalAlignment="Left" Margin="12,105,0,0" x:Name="listBox1" VerticalAlignment="Top" Width="120" /> 

    <ContentControl Height="120" HorizontalAlignment="Left" Margin="191,105,0,0" Name="contentControl1" VerticalAlignment="Top" Width="300" ContentTemplate="{DynamicResource MyDataTemplate}" Content="{Binding SelectedItem,ElementName=listBox1}"/> 

    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="202,56,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 

</Grid> 

Le code C#:

public MainWindow() 
    { 
     InitializeComponent(); 
     listBox1.Items.Add(new MyItem(32)); 
     listBox1.Items.Add(new MyItem(45)); 
     listBox1.Items.Add(new MyItem(5)); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     ((MyItem)listBox1.SelectedItem).Value = 4564654; 
    } 

Une classe supplémentaire:

public class MyItem 
{ 
    public MyItem(Int32 Value) 
    { 
     this.Value = Value; 
    } 

    public Int32 Value { get; set; } 
} 

Et le modèle: Je suis sûr qu'il me manque quelque chose comme notifier l'interface utilisateur des changements dans la source ou appeler une actualisation d'une manière ou d'une autre. C'est une version beaucoup plus simplifiée de mon vrai problème qui inclut des contrôles et des étiquettes, etc. qui doivent être actualisés quand la source change. A bientôt :)

+0

Que diriez-vous du code? – DHN

+0

Certains exemples de code seraient utiles. Il semble que vous écoutiez des événements dans la zone de liste. Lorsque la zone de liste change, vous obtenez des mises à jour dans la zone de texte, mais si vous modifiez la variable, aucune notification n'est envoyée et votre zone de texte ne change pas. –

Répondre

5

Votre classe MyItem doit probablement implémenter l'interface INotifyPropertyChanged. Lorsque la propriété Value est modifiée, appelez OnPropertyChanged ("Value") pour indiquer à l'interface que la valeur a changé et qu'elle doit être redessinée.

public class MyItem : INotifyPropertyChanged 
{ 
    public MyItem(Int32 Value) 
    { 
     this.Value = Value; 
    } 

    private Int32 _value; 
    public Int32 Value 
    { 
     get { return _value; } 
     set { _value = value; OnPropertyChanged("Value"); } 
    } 
} 
+0

Salut Rachel, merci pour le conseil. Oui, je vois d'où tu viens, j'ai testé et ça marche, merci de m'avoir indiqué la bonne direction. Merci beaucoup! – Edgar