Связывание пользовательского элемента управления WPF - функция вызова OnPropertyChanged

Добрый вечер! Я прочитал несколько веток о связывании и подумал, что мне это удалось (по крайней мере, для textBoxes, ObservableCollections и т. Д.). Однако теперь у меня есть более сложная проблема, и я где-то заблудился:

Я создал UserControl (STATUSBOX), содержащий ярлыки и т. Д. Я связываю эти ярлыки следующим образом:

 <Label x:Name="c1" x:FieldModifier="private" Grid.Column="1" 
    Grid.Row="1" Height="20" Style="{StaticResource labelTable}" 
    Width="140" Content="{Binding Path= value1}" Margin="0,0,0,0" ></Label>

В коде я реализовал это так:

public String value1
    {
        get { return (String)GetValue(ValueProperty1); }
        set {
                SetValue(ValueProperty1, value); 
                //setLightColor(1, value); //[I]
            }
    }
    public static readonly DependencyProperty ValueProperty1 =
        DependencyProperty.Register("value1", typeof(string),
          typeof(UC_StatusBox_detailed), new PropertyMetadata(null));

Это работает просто отлично.

Однако теперь я пытаюсь добавить индикатор состояния, который переключается с зеленого на красный. Поэтому я создал новый UserControl (LAMPCONTROL), который отображает часть изображения спрайта:

<Border x:Name="frame" x:FieldModifier="private" Width="30" Height="30" Grid.Column="0" 
    Grid.Row="0" CornerRadius="4" BorderThickness="1">
    <Rectangle Height="30" Width="30" Grid.Column="0" 
        HorizontalAlignment="Right" VerticalAlignment="Center">
            <Rectangle.Fill>
                <ImageBrush x:Name="imgBrush" x:FieldModifier="private" ViewboxUnits="Absolute" Viewbox="0,0, 30,30" ImageSource="/TestControl;component/Icons/spriteLight.png"/>
            </Rectangle.Fill>
    </Rectangle>            
</Border>

Я добавил следующий метод:

private void UpdateLightStatus(Boolean statusOK)
    {
        int offset;         
        if (statusOK)
        {
            offset = 0;
        }
        else
        {
            offset = 30;
        }
        this.imgBrush.Viewbox = new Rect(offset, 0, 30, 30);
    }

Это также работает, если я использую это "в одиночку".

Однако, если я попытаюсь реализовать это в своем STATUSBOX, у меня возникнут проблемы с тем, чтобы заставить его работать... Я надеялся сделать что-то вроде этого [I], и все будет сделано, но это не работает. При следующем подходе я попытался создать DependencyProperty в LAMPCONTROL, равный значению в STATUSBOX, и добавить привязку в xaml LAMPCONTROL, и оттуда я немного запутался.

Короче говоря, вопрос заключается в следующем: как вызвать метод sub-UserControl из main-UserControl при изменении свойства привязки main-UserControl?

Я надеюсь, что это немного понятно, в чем заключается моя проблема, если требуется больше информации, я рад сообщить об этом, но я не хотел, чтобы этот вопрос был еще больше, чем сейчас...

Спасибо за чтение всего этого и наилучшими пожеланиями

Fabian


Клеменс направил меня в правильном направлении. Решение ниже

2 ответа

Решение

Клеменс направил меня в правильном направлении. Решение заключается в следующем:

public static readonly DependencyProperty Value1Property =
    DependencyProperty.Register("Value1", typeof(string),
      typeof(UC_StatusBox_detailed), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender,
          new PropertyChangedCallback(OnValueChanged)));


private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//my code here
}

Как вызвать метод sub-UserControl из main-UserControl при изменении связанного свойства main-UserControl?

Вы могли бы дать подконтроль x:Name в разметке XAML основного элемента управления:

<local:LampControl x:Name="subControl" />

Затем вы можете получить к нему доступ, используя это имя в коде основного элемента управления:

subControl.UpdateLightStatus(false);
Другие вопросы по тегам