WPF Usercontrol, событие TextBox PropertyChanged не запускается - PullRequest
2 голосов
/ 18 января 2010

У меня есть пользовательский контроль с DependencyProperty из Answer, который присоединен к TextBox.

Я запросил базу данных и связал ответ с пользовательским контролем, и на экране отобразилось правильное значение.

Проблема возникает, когда я редактирую TextBox, событие PropertyChanged не запускается и, следовательно, не позволяет мне сохранить правильное значение обратно в базу данных. Пожалуйста, смотрите ниже мой код.

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;
    }

}

Объявление экземпляра 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>

Заранее извиняюсь, я {относительно} новичок в WPF. Кто-нибудь может увидеть, где я могу пойти не так с этим?

Я успешно связал и обновил другие свои usercontrols (этот код является почти точной копией), но ответы на них ListBox, где этот пользовательский контроль связывается с TextBox.

Заранее спасибо, Кохан.

1 Ответ

4 голосов
/ 19 января 2010

Вы не привязали текстовое поле к свойству ответа. Что вы сделали, так это добавили измененный обработчик к свойству ответа, а когда он изменился, вы вручную установили текстовое свойство текстовых полей.

Ваш код должен выглядеть примерно так

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

это привязка между текстовым полем и свойством Answer в классе ConditionQuestion (пользовательский элемент управления). При изменении свойства ответа в пользовательском элементе управления текстовое поле будет обновляться, а при изменении текста в текстовом поле свойство ответа будет обновляться. С помощью этого кода вы можете удалить ваш метод Answer_PropertyChanged, который больше не нужен. обвязка заботится об этом

...