2013-10-02 4 views
2

У меня есть следующий класс:DependencyObject обходит систему DependencyProperty?

public class ValueMarker : DependencyObject 
{ 
    public static readonly DependencyProperty BrushProperty = DependencyProperty.Register("Brush", typeof(Brush), typeof(ValueMarker), new FrameworkPropertyMetadata(Brushes.Aqua)); 
    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(ValueMarker), new FrameworkPropertyMetadata(0d)); 
    public static readonly DependencyProperty OffsetProperty = DependencyProperty.Register("Offset", typeof(double), typeof(ValueMarker), new FrameworkPropertyMetadata(0d)); 

    public Brush Brush 
    { 
     get { return (Brush)GetValue(BrushProperty); } 
     set { SetValue(BrushProperty, value); } 
    } 

    public double Offset 
    { 
     get { return (double)GetValue(OffsetProperty); } 
     set { SetValue(OffsetProperty, value); } 
    } 

    public double Value 
    { 
     get { return (double)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 
} 

В XAML, я создаю массив ресурсов из них с некоторыми креплениями, как так:

 <x:Array Type="my:ValueMarker" x:Key="plainMarks"> 
      <my:ValueMarker Brush="Red" Offset="-5" Value="{Binding Path=...}" /> 
      <my:ValueMarker Brush="Orange" Offset="-5" Value="{Binding Path=...}"/> 
      <my:ValueMarker Brush="Orange" Offset="-5" Value="{Binding Path=...}"/> 
      <my:ValueMarker Brush="Red" Offset="-5" Value="{Binding Path=...}" /> 
     </x:Array> 

При отладке привязок, я заметил, что должен Я удаляю setter для DP, XAML будет отображать ошибку, говорящую о том, что свойство отсутствует. Насколько я понимаю, XAML использует систему DP для назначения значения, что позволяет привязывать. В этом случае, если XAML ожидает «нормальное» свойство, привязка невозможна. Кто-нибудь может просветить меня, как я могу заставить его работать?

+0

Что вы на самом деле спрашиваете? – meilke

+0

В случае, если вопрос не очевиден, я спрашиваю, как сделать массив свойств объекта зависимостей связующим для последующего связывания в качестве статического ресурса. –

ответ

1

Причина вы не можете связать свои ValueMarkers здесь потому, что:

1.They не в VisualTree вашего окна/UserControl.

2. Они не являются объектом типа, который может наследовать DataContext, даже если они не являются частью визуального дерева.

Поэтому для того, чтобы сделать ваше ValueMarkers связать со свойствами в View DataContext, в первую очередь вы должны вывести их из Freezable класса, как показано ниже:

public class ValueMarker : Freezable 
    { 
     //All your Dependency Properties comes here// 

     protected override Freezable CreateInstanceCore() 
     { 
      return new ValueMarker(); 
     } 
    } 

После этого вы можете просто связать ваш объект, как показано ниже:

<my:ValueMarker x:Key="vm1" Brush="Orange" Offset="-5" Value="{Binding Path=Text1}"/> 

Здесь Текст1 это свойство в Windows/элементы управления UserControl DataContext

Затем вы можете использовать этот ресурс как:

<TextBox Text="{Binding Value, Source={StaticResource vm1}, StringFormat=F2}"/> 

Аналогичным образом вы можете создать ресурс для других ValueMarkers, чтобы использовать их в привязке.

Вы не сможете связать, создав массив x: как просто x: массив не лежит в visualtree и не наследует DataContext, поэтому его элементы также не имеют к нему доступа.

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

+0

Спасибо за ответ. Эта информация заставила меня переосмыслить мой проект, и я также обнаружил привязку прокси-подхода, поэтому я думаю, что я поеду с этим. –

Смежные вопросы