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

У нас есть собственный класс панели, который анимирует своих потомков через внутренний объект 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 ответа

Решение

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

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}"
 />

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

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

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

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

Другие вопросы по тегам