Смешивание свойств DependencyProperty и INotifyPropertyChanged в модели представления - PullRequest
0 голосов
/ 24 сентября 2019

При построении модели представления допустимо смешивать свойства DependencyProperty и INotifyPropertyChanged?

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

Просмотр модели:

Imports System.ComponentModel

Public Class ViewModel4
    Inherits DependencyObject
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Public Shared ExternalValueProperty As DependencyProperty = DependencyProperty.Register("ExternalValue", GetType(Integer), GetType(ViewModel4), New PropertyMetadata(4))
    Public Shared BackgroundColorProperty As DependencyProperty = DependencyProperty.Register("BackgroundColor", GetType(Color), GetType(ViewModel4), New PropertyMetadata(Colors.DodgerBlue))

    Private _internalValue As Integer = 1
    Private _toggleState As Boolean = False
    Public Property ToggleCommand As ICommand

    Public Sub New()

        ' Add any initialization after the InitializeComponent() call.
        ToggleCommand = New RelayCommand(AddressOf ToggleSource)

    End Sub

    Public ReadOnly Property Value() As Integer
        Get
            Select Case _toggleState
                Case True
                    Return _internalValue
                Case Else
                    Return ExternalValue
            End Select
        End Get
    End Property

    Public Property ExternalValue() As Integer
        Get
            Return GetValue(ExternalValueProperty)
        End Get
        Set(value As Integer)
            SetValue(ExternalValueProperty, value)
        End Set
    End Property

    Public Property BackgroundColor() As Color
        Get
            Return GetValue(BackgroundColorProperty)
        End Get
        Set(value As Color)
            SetValue(BackgroundColorProperty, value)
        End Set
    End Property

    Private Sub ToggleSource(ByVal toggleState As Boolean)

        _toggleState = toggleState

        Select Case toggleState
            Case True
                BackgroundColor = Colors.Gold
            Case Else
                BackgroundColor = Colors.DodgerBlue
        End Select

        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Value)))

    End Sub

End Class

XAML:

<UserControl x:Class="UserControl4"
             x:Name="root"
             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:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WpfApp1"
             mc:Ignorable="d"
             d:DesignHeight="100"
             d:DesignWidth="100"
             >
    <UserControl.Background>
        <SolidColorBrush Color="{Binding BackgroundColor}" />
    </UserControl.Background>

    <StackPanel>
        <Label Content="{Binding Value}"
               Height="80" />
        <CheckBox Content="Override"
                  Command="{Binding ToggleCommand}"
                  CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}"
                  Height="20" />
    </StackPanel>
</UserControl>

Код:

Public Class UserControl4

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        Me.DataContext = New ViewModel4

    End Sub

End Class

Это простой пример, когда я переключаюсь между данными вне модели представления (ExternalValue DP) ивнутренние данные к нему.В этом примере я просто использую целое число, но эти данные могут быть получены из моей модели.

...