Связывание пользовательского элемента управления 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);