我们有一个自定义面板类,通过内部DoubleAnimation对象为其子项设置动画。但是,我们希望将动画的Duration依赖项属性公开为我们面板的公共属性,以便用户在使用我们的面板时可以在其XAML中更改它。但是我们不希望暴露动画对象的任何其他部分,只是持续时间。
不断向我建议的第一件事是使用PropertyChanged通知,但这只适用于setter,而不是getter。我们也不能简单地创建.NET属性,因为XAML完全绕过了.NET属性。
我的同事有一个聪明的想法......在外部属性和内部对象的属性之间使用双向数据绑定,这实际上看起来是一个非常简洁的解决方案。但是,除了数据绑定之外,还有另一种/更好的方法吗?通过它包含对象的公共接口来暴露内部对象的依赖属性?
更新
看起来像双向DataBinding是要走的路。 (感谢@Jeff!)为此,我发现这是设置外部DP的最佳方式,因此它是内部对象DP的完美匹配 - 元数据,默认值和全部 - !然后使用Jeff的绑定技巧,你就完成了!
public Duration Duration {
get { return (Duration)GetValue(DurationProperty); }
set { SetValue(DurationProperty, value); }
}
public static readonly DependencyProperty DurationProperty = DoubleAnimation.DurationProperty.AddOwner(
typeof(SlideContentPanel));
答案 0 :(得分:4)
尝试此操作...在外部对象上创建等效的依赖项属性,然后从内部对象绑定到外部对象。这将在两个方向上起作用。
Binding durationBinding = new Binding(){
Source = _doubleAnimation,
Path = new PropertyPath("Duration"),
Mode = BindingMode.TwoWay
};
BindingOperations.SetBinding(this, SlideContentPanel.DurationProperty, durationBinding);
对于xaml爱好者
<UserControl x:Class=”Controls.DataGrid.DataGrid2"
Name="rootControl">
<Grid>
<xcdg:DataGridControl Grid.Row="0"
Name="internalDataGrid"
SelectedItem="{Binding ElementName=rootControl, Path=SelectedItem}"
EditTriggers="{Binding ElementName=rootControl, Path=EditTriggers}"
/>
答案 1 :(得分:0)
有些事让我觉得你的“问题”很奇怪,所以这里有一些想法可以解决问题。
您的代码可以读取和设置依赖项属性。为什么不使用它而不是这个内部存储?
如果出于性能原因要使用内部存储值,请使用您已经说过的属性更改通知。属性更改时,更新内部值。当您在内部更改属性时,请以适当的时间间隔调用依赖项属性setter以更新其他所有者(忽略您将从中获取的属性更改事件)。
也许你的情况需要除此之外的东西,但第二种选择应该像这样的东西一样复杂。