Как вы предоставляете свойство зависимостей частного внутреннего объекта через интерфейс объекта, который его содержит? - PullRequest
3 голосов
/ 09 октября 2010

У нас есть собственный класс панели, который анимирует своих потомков через внутренний объект DoubleAnimation.Однако мы хотим представить свойство зависимости Duration анимации как открытое свойство нашей панели, чтобы пользователь мог изменить его в своем XAML при использовании нашей панели.Но мы не хотим показывать какую-либо другую часть объекта анимации, только продолжительность.

Первое, что мне постоянно предлагают, - это использовать уведомление PropertyChanged, но это будет работать только для установщика.не добытчик.Мы также не можем просто создать свойство .NET, так как XAML полностью обходит свойство .NET.

У моей коллеги была умная идея ... использовать двустороннюю привязку данных между внешним свойством исвойство внутреннего объекта, которое на самом деле кажется довольно аккуратным решением.Однако, помимо привязки данных, есть ли другой / лучший способ сделать это ... предоставить свойство зависимости внутреннего объекта через открытый интерфейс объекта, в котором он находится?

Обновлено:

Похоже, двустороннее связывание данных было подходящим способом.(Спасибо @Jeff!) С этой целью я нашел лучший способ настроить внешний DP, так что он идеально подходит - метаданные, значения по умолчанию и все - для DP внутреннего объекта!Тогда используйте связывающий трюк Джеффа, и все готово!

public Duration Duration {
    get { return (Duration)GetValue(DurationProperty); }
    set { SetValue(DurationProperty, value); }
}

public static readonly DependencyProperty DurationProperty = DoubleAnimation.DurationProperty.AddOwner(
    typeof(SlideContentPanel));

Ответы [ 2 ]

4 голосов
/ 09 октября 2010

Попробуйте это ... Создайте эквивалентные свойства зависимостей для внешних объектов, затем привяжите внутренний объект к внешнему объекту. Это будет работать в обоих направлениях.

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}"
 />
0 голосов
/ 09 октября 2010

Что-то кажется мне странным в вашей "проблеме", поэтому вот некоторые мысли, которые могут прояснить ситуацию.

Свойство зависимости может быть прочитано и установлено вашим кодом. Почему бы просто не использовать это вместо этого внутреннего хранилища?

Если вы хотите использовать значение внутреннего хранилища по соображениям производительности, используйте уведомление об изменении свойства, которое, как вы уже сказали, будет работать. Когда свойство изменится, обновите свое внутреннее значение. Когда ВЫ изменяете свойство внутри, вызывайте установщик свойства зависимостей через соответствующие интервалы, чтобы обновлять всех остальных (игнорируя событие изменения свойства, которое вы получите от этого).

Может быть, ваша ситуация требует чего-то иного, но второй вариант должен быть настолько сложным, насколько это возможно.

...