2

J'ai un contrôle utilisateur avec un DependencyProperty de Answer qui est attaché à un TextBox.WPF Usercontrol, l'événement TextBox PropertyChanged ne se déclenche pas

J'ai interrogé la base de données et lié la réponse à la commande usercontrol et la valeur correcte est affichée.

Le problème se produit lorsque je modifie le TextBox, l'événement PropertyChanged ne se déclenche pas et m'empêche donc d'enregistrer la valeur correcte dans la base de données. S'il vous plaît voir ci-dessous mon code.

Usercontrol:

<Grid> 
    <StackPanel> 
      <TextBlock Name="txtbQuestion" TextWrapping="Wrap" Text="Question" Foreground="Black" Margin="5" Style="{DynamicResource Label}" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}" ></TextBlock> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition /> 
       <ColumnDefinition Width="100" /> 
      </Grid.ColumnDefinitions> 
      <TextBox Name="txtAnswer" Margin="5" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Hidden" > 
       <TextBox.Style> 
        <Style> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding ElementName=cbMultiLine, Path=IsChecked}" Value="True"> 
           <Setter Property="TextBox.TextWrapping" Value="Wrap" /> 
           <Setter Property="TextBox.Height" Value="100" /> 
           <Setter Property="TextBox.AcceptsReturn" Value="True" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </TextBox.Style> 
      </TextBox> 
      <CheckBox Name="cbMultiLine" Content="MultiLine" Margin="5" FontFamily="Georgia" Grid.Column="1" /> 
     </Grid> 
     <Line Fill="Black" Margin="4" /> 
    </StackPanel> 
</Grid> 

Usercontrol.cs:

public partial class ConditionQuestion : UserControl 
{ 

    public static readonly DependencyProperty AnswerProperty = 
DependencyProperty.Register("Answer", typeof(string), typeof(ConditionQuestion), new UIPropertyMetadata(null, Answer_PropertyChanged)); 

    public static readonly DependencyProperty QuestionProperty = 
     DependencyProperty.Register("Question", typeof(string), typeof(ConditionQuestion), new UIPropertyMetadata(null, Question_PropertyChanged)); 

    public ConditionQuestion() 
    { 
     InitializeComponent(); 
    } 

    public string Answer 
    { 
     get { return (string)GetValue(AnswerProperty); } 
     set { SetValue(AnswerProperty, value); } 
    } 

    public string Question 
    { 
     get { return (string)GetValue(QuestionProperty); } 
     set { SetValue(QuestionProperty, value); } 
    } 

    private static void Answer_PropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     ((ConditionQuestion)source).txtAnswer.Text = (string)e.NewValue; 
    } 

    private static void Question_PropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     ((ConditionQuestion)source).txtbQuestion.Text = (string)e.NewValue; 
    } 

} 

exemple Déclarant de Usercontrol:

<ListBox ItemContainerStyle="{StaticResource noSelect}" ItemsSource="{Binding Answer}" 
     Name="lbQuestions" BorderBrush="#E6E6E6" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <my:ConditionQuestion Question="{Binding ConditionReportFormQuestions.Question}" 
            Answer="{Binding Answer, Mode=TwoWay, 
              UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Je m'excuse d'avance, je suis {relativement} nouveau à WPF. Quelqu'un peut-il voir où je vais me tromper avec ça?

J'ai réussi mes autres commandes usercontrols et mise à jour (ce code est presque une copie exacte) mais les réponses sur eux sont ListBox sélections où-comme ce usercontrol lie à un TextBox. Merci d'avance, Kohan.

+0

Désolé, peut-être que je suis bête du tout mais je ne vois pas où la zone de texte txtAnswer est liée à la propriété Answer .. – levanovd

+0

my: ConditionQuestion a une propriété appelée Answer, ceci est un DependencyProperty que j'ai créé. Lorsque cette propriété change, elle met à jour la zone de texte dans le contrôle usercontrol. – 4imble

+0

Mais où est la réaction de la zone de texte? – levanovd

Répondre

4

Vous n'avez pas lié la zone de texte à la propriété de réponse. Ce que vous avez fait est de mettre un gestionnaire changé sur votre propriété de réponse et quand il est changé, vous définissez manuellement la propriété de texte des zones de texte.

Votre code devrait ressembler à ceci

<TextBlock 
    Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:ConditionQuestion}}, Path=Answer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

c'est une liaison entre la zone de texte et la propriété Réponse sur la ConditionQuestion de classe (le contrôle de l'utilisateur). Chaque fois que la propriété Answer change sur le contrôle utilisateur, la zone de texte est mise à jour et chaque fois que vous modifiez le texte dans la zone de texte, la propriété Answer est mise à jour. Avec ce code, vous pouvez supprimer votre méthode Answer_PropertyChanged il n'est plus nécessaire. la reliure s'en charge

+1

Fonctionne parfaitement, je t'aime homme. Je ne comprends pas tout à fait pour le moment mais je le regarderai plus tard quand j'aurai du temps libre. Merci encore, prenez soin de vous. La liaison – 4imble

+0

signifie que vous n'avez jamais à mettre à jour votre interface utilisateur depuis votre modèle objet et que vous n'avez jamais à mettre à jour votre modèle objet depuis votre interface utilisateur. la liaison colle les deux ensemble, lorsque le modèle change l'interface utilisateur reflète les changements, lorsque l'interface utilisateur change le modèle est mis à jour. Une fois que vous avez compris le concept, vous pouvez concevoir votre interface utilisateur et votre modèle indépendamment les uns des autres. –

+0

Wow, mon idée était bonne, mais je pensais que c'était trop facile pour une réponse et je l'ai écrit dans les commentaires)) – levanovd

Questions connexes