如何在C#中创建XAML类似路径绑定
-
02-10-2019 - |
题
XAML {BINDING}构造非常方便,因为它会自动处理所有属性更改的问题。当您通过.NET数据结构向对象传递通往对象的路径时,这确实令人印象深刻,并且一切都会自动为您更新。
我想在C#中使用同样的东西。我想拥有从另一个属性的价值得出的属性。例子
class Foo
{
public Bar Bar = new Bar();
public string ItGetter
{
get
{
return Bar.Baz.It;
}
}
}
class Bar
{
public Baz Baz = new Baz();
}
class Baz
{
public string It { get { return "You got It!"; } }
}
如果您在foo上称iTgetter,则可以从BAZ获得IT值。这可以正常工作,除非它没有无效 - ie,如果它更改了,ITGETTER上不会有更改通知。此外,如果更改foo.bar或bar.baz的参考文献,您也不会获得变化的noficiatiat。
我可以在属性上添加适当的iChangenotify代码,但是我的问题是:如何编码itgetter属性,以便当路径中的任何引用或IT值更改时,它将调用其属性交换事件?我希望我不必手动设置属性更改路径中所有项目的事件。
谢谢你的帮助!
埃里克
解决方案
你可以看看 依赖性属性. 。它们允许您在WPF属性系统中定义属性,这些属性用元数据和详细的值分辨率系统备份。
对您来说重要的是,他们允许您注册为已更改的属性事件注册,并且可以使您获得取决于其他内容的价值。
周围还有其他一些好的艺术品 乔什·史密斯(Josh Smith) 和 基督教马索斯的“依赖性属性”
您可能还想阅读 依赖性属性回调和验证
其他提示
如Simon提到的那样,这是使用依赖属性的完整代码,它可以使用我要寻找的东西:
// This class exists to encapsulate the INotifyPropertyChanged requirements
public class ChangeNotifyBase : DependencyObject, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
public class Foo : ChangeNotifyBase
{
public Foo()
{
Bar = new Bar();
var binding = new Binding("Bar.Baz.It");
binding.Source = this;
binding.Mode = BindingMode.TwoWay;
BindingOperations.SetBinding(this, ItGetterProperty, binding);
}
/// <summary>
/// The ItGetter dependency property.
/// </summary>
public bool ItGetter
{
get { return (bool)GetValue(ItGetterProperty); }
set { SetValue(ItGetterProperty, value); }
}
public static readonly DependencyProperty ItGetterProperty =
DependencyProperty.Register("ItGetter", typeof(bool), typeof(Foo));
// Must do the OnPropertyChanged to notify the dependency machinery of changes.
private Bar _bar;
public Bar Bar { get { return _bar; } set { _bar = value; OnPropertyChanged("Bar"); } }
}
public class Bar : ChangeNotifyBase
{
public Bar()
{
Baz = new Baz();
}
private Baz _baz;
public Baz Baz { get { return _baz; } set { _baz = value; OnPropertyChanged("Baz"); } }
}
public class Baz : ChangeNotifyBase
{
private bool _it;
public bool It { get { return _it; } set { _it = value; OnPropertyChanged("It"); } }
}
如果您现在在itgetter上注册事件,则如果这些事情发生了变化,您将获得通知:baz.it foo.bar(即更改参考)bar.baz“”
如果将对象引用(foo.bar或bar.baz)设置为null,则iTgetter的值将更改为false。
不隶属于 StackOverflow