При построении модели представления допустимо смешивать свойства 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) ивнутренние данные к нему.В этом примере я просто использую целое число, но эти данные могут быть получены из моей модели.