Прикрепленное свойство не работает должным образом на элементе управления - PullRequest
0 голосов
/ 16 октября 2011

Когда я объявляю свойство как обычное свойство зависимости, оно работает, однако, когда оно объявляется как прикрепленное, это не так.Я не уверен, что мне здесь не хватает.Пожалуйста помоги.Ниже приведен код.

(Набор 1 со свойством зависимости работает хорошо, но Набор 2 со свойством зависимостей не работает)

<StackPanel Name="PanelControl"  Orientation="{Binding ElementName=MainWindow, Path=ControlOrientation, Converter={StaticResource ResourceKey=LocalConvertor}}"/>

Набор 1

FrameworkPropertyMetadata metaData1 = new FrameworkPropertyMetadata(Orientation.Vertical, FrameworkPropertyMetadataOptions.AffectsRender);                     
ControlOrientationProperty = DependencyProperty.RegisterAttached("ControlOrientation", typeof(Orientation), typeof(CustomTextBoxUsingDependencyProperty), metaData1); 

public Orientation ControlOrientation
{
    get { return (Orientation)(GetValue(ControlOrientationProperty)); }
    set { SetValue(ControlOrientationProperty, value); }
}
 <clist:CustomTextBoxUsingDependencyProperty Width="742" Height="100" ControlOrientation="Horizontal"/>

Набор 2

ControlOrientationProperty = DependencyProperty.RegisterAttached("ControlOrientation", typeof(Orientation), typeof(CustomTextBoxUsingDependencyProperty), metaData1); 

public static void SetControlOrientation(UIElement element, Orientation value)
{
    element.SetValue(CustomTextBoxUsingDependencyProperty.ControlOrientationProperty, value);
}
public static Orientation GetControlOrientation(UIElement element)
{
    return (Orientation)element.GetValue(CustomTextBoxUsingDependencyProperty.ControlOrientationProperty);
}
<clist:CustomTextBoxUsingDependencyProperty Width="742" Height="100">
    <Button Content="Test" clist:CustomTextBoxUsingDependencyProperty.ControlOrientation="Horizontal"/>
</clist:CustomTextBoxUsingDependencyProperty>

Ответы [ 3 ]

0 голосов
/ 16 октября 2011

Все еще не знаете, в чем проблема, но я бы предположил, что это привязка к вашей StackPanel?Если это так, то вам нужно изменить Binding.Path, если вы нацелены на присоединенное свойство, вам нужны скобки и класс-владелец, т.е.

{Binding (clist:CustomTextBoxUsingDependencyProperty.ControlOrientation),
         ElementName=...}
0 голосов
/ 16 октября 2011

Поскольку DP предназначены для использования только для элемента управления, на котором вы их объявили.Вот почему это прекрасно работает с DP-

<StackPanel Name="PanelControl"  Orientation="{Binding ElementName=MainWindow, Path=ControlOrientation, Converter={StaticResource ResourceKey=LocalConvertor}}"/>

Однако, когда вы объявляете его как присоединенное свойство, его можно использовать для любого элемента управления, который вы хотите.Если после загрузки этого элемента управления вы видите окно вывода, это может привести к сбою привязки, так как не удалось восстановить привязку для ControlOrientation.Вам необходимо выполнить связывание следующим образом -

<StackPanel Name="PanelControl"  Orientation="{Binding ElementName=MainWindow, Path=(clist:CustomTextBoxUsingDependencyProperty.ControlOrientation), Converter={StaticResource ResourceKey=LocalConvertor}}"/>

Также для обоих ваших наборов я вижу, что оба свойства - «Зарегистрировать как прикрепленные».Это опечатка?

0 голосов
/ 16 октября 2011

Вы должны написать PropertyChanged CallBack для выполнения действия

ControlOrientationProperty = DependencyProperty.RegisterAttached("ControlOrientation", 
                                typeof(Orientation), 
                                typeof(CustomTextBoxUsingDependencyProperty), 
                                new FrameworkPropertyMetadata(OnControlOrentationChnaged)); 

public static void SetControlOrientation(UIElement element, Orientation value)
{
    element.SetValue(CustomTextBoxUsingDependencyProperty.ControlOrientationProperty, value);
}
public static Orientation GetControlOrientation(UIElement element)
{
    return (Orientation)element.GetValue(CustomTextBoxUsingDependencyProperty.ControlOrientationProperty);
}

private static void OnControlOrentationChnaged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{       
    // o will be the control on which the property is applied
    //Your logic here
}

Это может помочь

...