PropertyChangedCallback UserControl не запускается - PullRequest
1 голос
/ 04 ноября 2019

У меня есть usercontrol с некоторым свойством зависимости. Один из них (ValueProperty) получил PropertyChangedCallback, но он никогда не запускается.

namespace test
{
public partial class IndicatorLigth : UserControl
    {
        public IndicatorLigth()
        {
            InitializeComponent();
            DataContext = this;
            CurrentBrush = new SolidColorBrush(InactiveColor);
            lIndicator.Background = CurrentBrush;
            TurnOnValue = true;
            Value = true;
        }       

        public static readonly DependencyProperty ActiveColorProperty =
            DependencyProperty.Register("ActiveColor", typeof(Color), typeof(IndicatorLigth), new UIPropertyMetadata(Colors.Green));

        public Color ActiveColor
        {
            get { return (Color)GetValue(ActiveColorProperty); }
            set { SetValue(ActiveColorProperty, value); }
        }

        public static readonly DependencyProperty InactiveColorProperty =
            DependencyProperty.Register("InactiveColor", typeof(Color), typeof(IndicatorLigth), new UIPropertyMetadata(Colors.Red));

        public Color InactiveColor
        {
            get { return (Color)GetValue(InactiveColorProperty); }
            set { SetValue(InactiveColorProperty, value); }
        }

        private SolidColorBrush _currentBrush;

        public SolidColorBrush CurrentBrush
        {
            get { return _currentBrush; }
            set { _currentBrush = value; }
        }

        public static readonly DependencyProperty TurnOnValueProperty =
            DependencyProperty.Register("TurnOnValue", typeof(bool), typeof(IndicatorLigth), new UIPropertyMetadata(true));

        public bool TurnOnValue
        {
            get { return (bool)GetValue(TurnOnValueProperty); }
            set { SetValue(TurnOnValueProperty, value); }
        }

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(bool), typeof(IndicatorLigth),
                                        new FrameworkPropertyMetadata(true,
                                            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSetColorChanged));

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

        private void CheckStatus(bool sign)
        {            
            if (sign == TurnOnValue)
                CurrentBrush = new SolidColorBrush(ActiveColor);
            else CurrentBrush = new SolidColorBrush(InactiveColor);  
        }

        private static void OnSetColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            IndicatorLigth mycontrol = d as IndicatorLigth;
            mycontrol.callmyInstanceMethod(e);
        }
        private void callmyInstanceMethod(DependencyPropertyChangedEventArgs e)
        {
            CheckStatus((bool)e.NewValue);
            lIndicator.Background = CurrentBrush;
        }
    }
}

И XAML, где я использую свой usercontrol (я использую его в другом UserControl):

<UserControl
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:local="clr-namespace:test"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" >
...
<StackPanel Orientation="Vertical">
   <Label Content="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.Sign}"/>
   <StackPanel>
       <local:IndicatorLigth ActiveColor="Thistle" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.Sign}"/>
   </StackPanel>
</StackPanel>

Параметр Sign принадлежит привязываемому свойству IsEnabled ComboBox, которого нет вКод XAMLСодержимое метки правильное, оно меняется, когда я меняю статус включенного комбобокса, но мои установщики UserControl Value, OnSetColorChanged и callmyInstanceMethod не запускаются. Не могли бы вы сказать мне, что не так в моем коде? Большое спасибо.

Обновление: так что я ошибся. Код, упомянутый выше, является правильным. Проблема будет происходить, когда я вставляю панель стека в devexpress LayoutGroup HeaderTemplate:

<dxlc:LayoutGroup Orientation="Vertical" VerticalAlignment="Top"> 
<dxlc:LayoutGroup.HeaderTemplate>
  <DataTemplate>
    <StackPanel Orientation="Vertical">
      <Label Content="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.Sign}"/>
      <StackPanel>
         <local:IndicatorLigth ActiveColor="Thistle" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.Sign}"/>
      </StackPanel>
    </StackPanel>
  </DataTemplate>
</dxlc:LayoutGroup.HeaderTemplate>
</dxlc:LayoutGroup>

1 Ответ

0 голосов
/ 04 ноября 2019

Извините, что беспокою вас, и спасибо за советы. Я нашел причину проблемы. Мне не нужно использовать <HeaderTemplate><DataTemplate>, я должен использовать простой <Header> блок:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...