Вместо привязки непосредственно к свойству источника с использованием синтаксиса {Binding}
в XAML, вы можете подписаться на событие PropertyChanged
модели представления самостоятельно в представлении и программно анимировать свойство, например:
private void OnViewLoaded(object sender, RoutedEventArgs e)
{
ViewModel viewModel = DataContext as ViewModel;
if (viewModel != null)
{
Canvas.SetLeft(line, viewModel.Position);
viewModel.PropertyChanged += OnPropertyChanged;
}
}
private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Position")
{
double from = Canvas.GetLeft(line);
if (double.IsNaN(from))
from = 0;
ViewModel viewModel = sender as ViewModel;
if (viewModel != null)
{
DoubleAnimation doubleAnimation = new DoubleAnimation()
{
From = from,
To = viewModel.Position,
Duration = TimeSpan.FromSeconds(1)
};
line.BeginAnimation(Canvas.LeftProperty, doubleAnimation);
}
}
}
XAML:
<Canvas Width="100" Height="100" Background="Beige">
<Line x:Name="line"
Canvas.Top="0"
Stroke="#887FFF00"
StrokeThickness="2"
X1="0" Y1="0"
X2="0" Y2="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType=Canvas}}">
</Line>
</Canvas>
Это пример ситуации, когда вы хотите реализовать пользовательскую специфичную для представления логику в представлении, и выне хочу делать это в XAML.Это никак не нарушает схему MVVM.