2008-12-12 7 views
3

J'apprends WPF, et semble avoir trouvé quelque chose d'un peu étrange, que je ne peux pas trouver la raison de l'endroit où j'ai cherché.C# et WPF: Programmatic Control

J'ai une fenêtre avec une case à cocher appelée "chkTest". Je l'ai défini pour être vrai par défaut.

Le code suivant est ce que je ne comprends pas. Fondamentalement, j'essaie de définir le contrôle "chkTest" à un contrôle que je crée à la volée. La boîte de message affiche la valeur que j'ai définie dans le code, mais le contrôle sur la fenêtre est toujours défini sur true.

Quelqu'un peut-il expliquer le processus sous-jacent?

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     CheckBox chk = new CheckBox(); 
     chk.IsChecked = false; 

     this.chkTest = chk; 

     MessageBox.Show(chk.IsChecked.Value.ToString()); 
    } 
} 

Merci

Répondre

3

C'est parce que vous êtes duper le système DependencyProperty en faisant cela - rappelez-vous, getters/setters de propriétés DP fonctionnent différemment que les propriétés régulières. L'interface utilisateur possède un déclencheur sur la propriété IsChecked, mais vous remplacez l'objet entier. Puisque vous n'avez pas réellement changé IsChecked sur la case visible, le déclencheur ne se déclenche pas et l'interface utilisateur n'est pas mise à jour.

3

Voici une façon de procéder. Tout d'abord, vous donnez un nom à votre réseau principal - disons, LayoutRoot:

<Grid x:Name="LayoutRoot"> 
    <CheckBox x:Name="chkTest" IsChecked="True"></CheckBox> 
</Grid> 

Ensuite, vous dites:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     CheckBox chk = new CheckBox(); 
     chk.IsChecked = false; 

     LayoutRoot.Children.Remove(chkTest); 
     LayoutRoot.Children.Add(chk); 
    } 
} 

Et vous avez terminé.