Пользовательский контроль привязки не стреляет - PullRequest
1 голос
/ 20 февраля 2020

У меня есть пользовательский элемент управления со следующим кодом:

public partial class TableSelectorControl : UserControl
{
    private Brush _cellHoverBrush = new SolidColorBrush(Colors.CadetBlue) { Opacity = 0.3 };

    public static readonly DependencyProperty ActiveSelectionProperty =
        DependencyProperty.Register("ActiveSelection", typeof(TableSelectorSelection),
            typeof(TableSelectorControl));

    public TableSelectorSelection ActiveSelection
    {
        get => (TableSelectorSelection)GetValue(ActiveSelectionProperty);
        set 
        {
            SetValue(ActiveSelectionProperty, value);
            _cellHoverBrush = value.HoverBrush;
        }
    }
}

Как видите, я пытаюсь установить _cellHoverBrush для каждого ActiveSelectionProperty обновления, что делается из ViewModel. Привязка работает хорошо, и кажется, что ActiveSelectionProperty меняется, но установщик не стреляет. Я, конечно, могу использовать FrameworkProperyMetadata, но я не хочу, чтобы _cellHoverBrush стал static, идея состоит в том, чтобы изменить его относительно выбранного ActiveSelection. Как мне этого добиться?

Я могу предоставить больше информации, если это необходимо.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Существует два типа свойств в WPF:. NET Свойства платформы и свойства зависимостей (которые указаны c для WPF). Каждое свойство зависимостей имеет связанное свойство. Net Framework, но это свойство является лишь оболочкой над свойствами зависимостей WPF. Это сделано для того, чтобы стандартизировать способ работы со свойствами в WPF. Когда свойство зависимостей используется в привязках из файлов .xaml, среда WPF не будет использовать свойство оболочки. Net для получения или установки значения. Вот почему в вашем свойстве оболочки. NET не указано использование кода, отличного от GetValue и SetValue.

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

public partial class TableSelectorControl : UserControl
{
    private Brush _cellHoverBrush = new SolidColorBrush(Colors.CadetBlue) { Opacity = 0.3 };

    public static readonly DependencyProperty ActiveSelectionProperty =
        DependencyProperty.Register("ActiveSelection", typeof(TableSelectorSelection),
            typeof(TableSelectorControl), new PropertyMetadata(new PropertyChangedCallback(OnActiveSelectionChanged)));

    public TableSelectorSelection ActiveSelection
    {
        get => (TableSelectorSelection)GetValue(ActiveSelectionProperty);
        set => SetValue(ActiveSelectionProperty, value);
    }

    private static void OnActiveSelectionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var tableSelCtrl = d as TableSelectorControl;
        if (tableSelCtrl != null)
        {
            tableSelCtrl._cellHoverBrush = (e.NewValue as TableSelectorSelection)?.HoverBrush;
        }
    }
}
1 голос
/ 20 февраля 2020

Использование PropertyChangedCallback FrameworkPropertyMetadata не обязательно означает, что вам нужно сделать ваше поле c. Ваш метод-обработчик получит ссылку на вызывающий его экземпляр, который вы затем сможете изменить - хотя вам сначала нужно будет привести его к вашему типу.

Пошаговое руководство по PropertyChanged на этой странице показывает один из возможных способов Это. https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/dependency-property-callbacks-and-validation

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