我想我可能错误地使用了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;
}
}
答案 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));
}
}
}