0

私はWPFを初めて使用し、依存関係プロパティをバインドしようとしています。WPFCtrl:FilterTextBoxに書き込んだテキストがTextBlockに表示されるようにしたいと思います

これが私のXAMLです

    xmlns:WPFCtrl="clr-namespace:WPFControls"
    xmlns:local="clr-namespace:WpfApplication9"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
    <local:Person x:Key="myDataSource" />
    </Window.Resources>
    <Grid>
    <StackPanel>
    <StackPanel.DataContext>
        <Binding Source="{StaticResource myDataSource}"/>
    </StackPanel.DataContext>
    <WPFCtrl:FilterTextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged }"/>
    <TextBlock Width="55" Height="25" Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>

ここで人のクラス

namespace WpfApplication9
{
    public class Person : INotifyPropertyChanged
    {
        private string name = "";
        // Declare the event
        public event PropertyChangedEventHandler PropertyChanged;

        public Person()
        {
        }

        public Person(string value)
        {
            this.name = value;
        }

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                // Call OnPropertyChanged whenever the property is updated
                OnPropertyChanged("Name");
            }
        }

        // Create the OnPropertyChanged method to raise the event
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));

            }
        }
    }   
}

およびFilterTextBoxテキストプロパティ

 public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(FilterTextBox), new PropertyMetadata());

    public string Text
    {
        //get { return _tbFilterTextBox.Text == null ? null : _tbFilterTextBox.Text.TrimEnd(); }
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
        //set { _tbFilterTextBox.Text = value; }
    }

問題は、OnPropertyChanged()に入力されないことです。何が間違っているのですか?

4

2 に答える 2

1

この「FilterTextBox」コントロールは、テキストが挿入されるたびに DP を更新しますか?

FilterTextBox には、内部に通常の TextBox を含む ControlTemplate があると思います。何かのようなもの

<ControlTemplate TargetType="{x:Type FilterTextBox}">
 <TextBox Name="PART_FilterTextBoxInputField" Text="{TemplateBinding Text}"/>
</ControlTemplate>

UpdateSourceTrigger=PropertyChanged も使用するには、内部テキスト ボックスが Text-Dependcy プロパティにバインドされるバインディングを設定する必要があります。そうしないと、テキストボックスがフォーカスを失ったときにのみバインディングが更新されます。

于 2012-06-01T11:32:19.383 に答える
1

問題は、TextPropertyinがデフォルトでFilterTextBoxバインドされないことです。TwoWay

に設定するかBindingModeTwoWay

<WPFCtrl:FilterTextBox Text="{Binding Path=Name,
                                      Mode=TwoWay,
                                      UpdateSourceTrigger=PropertyChanged }"/>

または、メタデータを変更して、DependencyProperty Textデフォルトで双方向にバインドするようにします

public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register("Text",
                                typeof(string),
                                typeof(FilterTextBox),
                                new FrameworkPropertyMetadata(null,
                     FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
于 2012-06-01T11:39:30.507 に答える