0

私はWPFが初めてで、過去数日間、これについて頭を悩ませていました。テキストボックスの基本的なバインディングを文字列プロパティに設定しようとしています。MS のチュートリアルに従いましたが、何も機能していないようです。

これがメールクラスです。件名プロパティをバインドしてテキストボックスに表示しようとしています

public class Email : INotifyPropertyChanged
{
    private string _subject;

    public string Subject
    {
        get { return _subject; }
        set
        {
            _subject = value;
            OnPropertyChanged("Subject");
        }
    }

    private string _contents;

    public string Contents
    {
        get { return _contents; }
        set
        {
            _contents = value;
            OnPropertyChanged("Contents");
        }
    }

    private Category _category;

    public Category Category
    {
        get { return _category; }
        set
        {
            _category = value;
            OnPropertyChanged("Category");
        }
    }

    public Email()
    {
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
}

テキストボックスを親にする UserControl 内の電子メールセッターは次のとおりです。

private Email _email;

public Email Email
{
    get { return _email; }
    set
    {
        _email = value;
        if (_email != null)
        {
            Binding myBinding = new Binding("Subject");
            myBinding.Source = _email;
            tbSubject.SetBinding(TextBlock.TextProperty, myBinding);
        }
    }
}

渡された電子メールが null ではなく、件名がある場合でも、tbSubject は常に空です。私がこれを行うと:

public Email Email
{
    get { return _email; }
    set
    {
        _email = value;
        if (_email != null)
        {
            tbSubject.Text = _email.Subject;
        }
    }
}

それは正常に動作します。私は自分が間違っていることを理解していません。

4

1 に答える 1

0

私はそれを手に入れたと思います。これが私がしなければならなかった変更です:

    public partial class EmailContentsTemplate : UserControl, INotifyPropertyChanged
{
    private Email _email;

    public Email Email
    {
        get { return _email; }
        set
        {
            _email = value;
            OnPropertyChanged("Email");
        }
    }


    public EmailContentsTemplate()
    {
        InitializeComponent();

        DataContext = this;

        Binding myBinding = new Binding("Email.Subject");
        myBinding.Source = this;
        tbSubject.SetBinding(TextBlock.TextProperty, myBinding);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
}

そこで、ソースを「this」に変更し、ユーザー コントロールに INotifyPropertyChanged を実装させました。今では動作します。

別の方法として、XAMLを介して動作させました

<TextBox x:Name="tbSubject" Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding Email.Subject}"/>
于 2013-09-15T20:20:43.587 に答える