3

我们有一个自定义面板类,它通过内部 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));
4

2 回答 2

5

试试这个...在外部对象上创建等效的依赖属性,然后从内部对象绑定到外部对象。这将在两个方向上起作用。

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}"
 />
于 2010-10-08T21:32:04.117 回答
0

你的“问题”让我觉得有些奇怪,所以这里有一些想法可以解决问题。

依赖属性可以由您的代码读取和设置。为什么不直接使用它而不是这个内部存储呢?

如果您出于性能原因想使用内部存储值,请使用您已经说过会起作用的属性更改通知。当属性改变时,更新你的内部值。当您在内部更改属性时,请以适当的时间间隔调用依赖属性设置器以更新其他所有人(忽略您将从那里收到的属性更改事件)。

也许您的情况需要除此之外的其他东西,但是第二个选项应该像这样的事情一样复杂。

于 2010-10-08T20:35:57.160 回答