В настоящее время я работаю над проектом MVVM, который использует Window (с моей ViewModel) и мой собственный UserControl. UserControl почти пуст в файле .xaml, потому что все его функциональные возможности происходят из-за кода, который рисует различные формы. Я хотел связать свойство из ViewModel с DependencyProperty в UserControl, но независимо от того, что я делаю, я не могу заставить его работать. Я прочитал множество ответов здесь и на разных веб-сайтах и заметил, что это может быть что-то с DataContext UserControl, но я все равно не смог решить проблему. Способ, которым я вызываю событие PropertyChanged в моей ViewModel, является правильным. Я могу успешно привязать свое свойство к другим элементам управления (например, TextBoxes и т. Д.), Но не к своему. Я был бы признателен, если бы вы могли объяснить мне, почему это не работает и как это исправить. Привет!
MainWindow.xaml привязка:
<Grid Margin="10">
<local:FretboardControl Grid.Row="0" Fretboard="{Binding CurrentFretboard, Mode=TwoWay}"/>
</Grid>
FretboardControl.xaml:
<UserControl ...>
<Grid>
<TextBlock Text="{Binding Path=Fretboard, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:FretboardControl}}"/>
//the TextBlock above is just a test
<Canvas.../>
</Grid>
</UserControl>
FretboardControl.xaml.cs (код позади):
public static readonly DependencyProperty FretboardProperty = DependencyProperty.Register
(nameof(Fretboard), typeof(Fretboard), typeof(FretboardControl), new PropertyMetadata(new Fretboard(), PropertyChangedCallback));
public Fretboard Fretboard {
get {
return GetValue(FretboardProperty) as Fretboard;
}
set {
SetValue(FretboardProperty, value);
}
}
protected static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e) {
//breakpoint here. It is reached only once during runtime:
//at start, when the default value is inserted
if (o is FretboardControl) {
(o as FretboardControl).RefreshFretboard();
}
}