Привязка цвета к DependencyProperty в UserControl - PullRequest
0 голосов
/ 04 марта 2019

У меня есть UserControl, у которого есть Grid со связанным свойством Background.Все остальные мои привязки работают должным образом, но по какой-то причине единственный цвет, который я получаю в моем UserControl, - это значение по умолчанию, которое я установил для DependencyProperty.

Ссылка на UserControl в MainWindow.xaml:

<controls:MyUserControl Title="{Binding Path=MyObjects[0].Title" MyControlColor="{Binding Path=MyObjects[0].Color}" />

Title отображается, как и ожидалось, но цвет не меняется.

MyUserControl код (я использую MyControlColorBrush для источника цвета, который просто преобразует MyControlColor в SolidColorBrush. Код вниз.):

<Grid Background="{Binding Path=MyControlColorBrush, RelativeSource={RelativeSource AncestorType=UserControl}}">
    <TextBlock Text="{Binding Path=Title, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Grid>

MyUserControl.xaml.cs код:

public Color MyControlColor
{
    get { return (Color)GetValue(MyControlColorProperty); }
    set { SetValue(MyControlColorProperty, value); }
}
    public static readonly DependencyProperty MyControlColorProperty = DependencyProperty.Register("MyControlColor", typeof(Color), typeof(MyUserControl), new PropertyMetadata(Colors.Black));

А затем свойство, которое просто преобразует цвет в SolidColorBrush:

public SolidColorBrush MyControlColorBrush
{
    get { return new SolidColorBrush(MyControlColor); }
}

Есть идеи о том, чего мне не хватает?Если я проверяю значение MyControlColor, оно показывает правильный цвет, но фон Grid просто не меняется с Black.

1 Ответ

0 голосов
/ 04 марта 2019

Привязка к MyControlColorBrush происходит только один раз при первой загрузке вашей страницы.Ваша привязка к MyObjects[0].Color вызывает обновление свойства зависимостей, но ничто не указывает остальной части вашего приложения, что MyControlColorBrush также необходимо обновить.

Есть несколько способов добиться этого, самый простой -возможно, просто создать свойство зависимости только для чтения для вашей кисти, которое вы обновляете всякий раз, когда обнаруживаете изменение в свойстве цвета (это похоже на то, как работают свойства Width / ActualWidth).Вашему контролю понадобится DP для цвета:

public Color MyControlColor
{
    get { return (Color)GetValue(MyControlColorProperty); }
    set { SetValue(MyControlColorProperty, value); }
}

public static readonly DependencyProperty MyControlColorProperty =
    DependencyProperty.Register("MyControlColor", typeof(Color), typeof(MyUserControl),
        new PropertyMetadata(Colors.Black, OnColorChanged));

И затем DP только для чтения для кисти:

public Brush MyControlColorBrush
{
    get { return (Brush)GetValue(MyControlColorBrushProperty); }
    protected set { SetValue(MyControlColorBrushPropertyKey, value); }
}

private static readonly DependencyPropertyKey MyControlColorBrushPropertyKey
        = DependencyProperty.RegisterReadOnly("MyControlColorBrush", typeof(Brush), typeof(MyUserControl),
                new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.None));

public static readonly DependencyProperty MyControlColorBrushProperty = MyControlColorBrushPropertyKey.DependencyProperty;

И вы будете обновлять кисть всякий раз, когда ваш цвет DPизменения:

private static void OnColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    (d as MyUserControl).MyControlColorBrush = new SolidColorBrush((Color)e.NewValue);
}

Элементы GUI в вашем пользовательском элементе управления затем привязываются к DP только для чтения, например:

<Grid Background="{Binding Path=MyControlColorBrush, RelativeSource={RelativeSource AncestorType=local:MyUserControl}}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...