文本框中的两个图层绑定不是写入

时间:2012-02-29 21:27:53

标签: wpf

我想我可能错误地使用了DependencyObject。

我有一个泛型类,它实现名为Person的DependencyObject,其属性为FirstName和LastName。

public class Person : DependencyObject
{
    public static readonly DependencyProperty FirstNameProperty =
        DependencyProperty.Register("FirstName", typeof(string), typeof(Person));

    public string FirstName
    {
        get { return (string)GetValue(FirstNameProperty); }
        set { SetValue(FirstNameProperty, value); }
    }

    public static readonly DependencyProperty LastNameProperty =
        DependencyProperty.Register("LastName", typeof(string), typeof(Person));

    public string LastName
    {
        get { return (string)GetValue(LastNameProperty); }
        set { SetValue(LastNameProperty, value); }
    }
}

然后我有一个xaml控件,其datacontext设置为我的ViewModel类。在ViewModel类中,我有一个名为UserName的属性,用于获取/设置Person。文本框绑定到UserName.FirstName属性。它可以正确填充文本框,但在输入字符和制表符时似乎无法调用该集。我认为问题是两级属性绑定。出于设计原因,我需要通过两个属性级别来访问它。有什么建议吗?

这是我的xaml:

<TextBox Width="100" Margin="10,0,0,0" Text="{Binding Path=UserName.FirstName, Mode=TwoWay}" />

以下是视图模型类中的属性:

    public Person UserName
    {
        get
        {
            return person;
        }
        set
        {
            person = value;
        }
    }

我也是这样尝试过的:

    public Person UserName
    {
        get
        {
            return person;
        }
        set
        {
            person.FirstName = value.FirstName;
        }
    }

2 个答案:

答案 0 :(得分:1)

您的属性不会从绑定中调用,属性只是因为模式而存在,所以它很容易从代码中看到。 绑定直接设置依赖属性。

为什么在这种情况下需要依赖属性?依赖属性与控件相关 - 对于您的场景使用常规属性和INotifyPropertyChanged - 代码将更简单:)

如果在更改dependencyproperty时确实需要通知,则必须向DependencyProperty.Register(...)调用添加静态事件处理程序。

答案 1 :(得分:1)

同意符文安徒生。 你应该使用INotifyPropertyChanged。

public class Person :INotifyPropertyChanged
    {

        private string _firstName;
        public string FirstName
        {
            get { return _firstName; }
            set { _firstName = value; OnPropertyChanged("FirstName"); }
        }
        private string _lastName;
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; OnPropertyChanged("LastName"); }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }