WPF - Привязка к пользовательскому элементу UserControl DependencyProperty не работает - PullRequest
0 голосов
/ 28 июня 2018

В настоящее время я работаю над проектом 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();
    }
}

1 Ответ

0 голосов
/ 28 июня 2018

Хорошо, так что, видимо, я, вероятно, нашел семя моей проблемы. Мой установщик CurrentFretboard вызвал событие PropertyChanged, но я не изменил ссылку на сам объект. Объект был изменен, но это был все тот же объект. Я думал, что это не имеет значения, и все равно будет отправлено в привязку, но похоже, что PropertyChangedCallback вызывается, только если ссылка была изменена. Я думаю, что я могу заменить ссылку на каждый набор или просто прослушать событие PropertyChanged уже в UserControl. Спасибо за помощь!

...