Strange BindingMode = двухстороннее поведение - PullRequest
1 голос
/ 01 сентября 2011

имеют этот код

public int SelectedPage
    {
        get { return (int)GetValue(SelectedPageeProperty); }
        set
        {
            SetValue(SelectedPageeProperty, value);
            if (NavigationCommands.Refresh.CanExecute(null, this))
                NavigationCommands.Refresh.Execute(null, this);
        }
    }

    // Using a DependencyProperty as the backing store for SelectedPage.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedPageeProperty =
        DependencyProperty.Register("SelectedPagee", typeof(int), typeof(DataBaseSettings), new UIPropertyMetadata(0));

wpf:

 <ComboBox  SelectedItem="{Binding Path=SelectedPage, Mode=TwoWay}" />

Странно то, что если свойство статической зависимости названо как открытое свойство SelectedPage, то привязка не работает,Но если я хоть немного переименую dp в SelectedPagee с помощью 2 ee, то это сработает.У кого-нибудь есть идея, которая могла бы объяснить это явление?

1 Ответ

5 голосов
/ 01 сентября 2011

Если вы переименуете свойство таким образом, привязка не найдет его и не использует установщик CLR-свойства, которое в противном случае будет полностью проигнорировано (по этой причине у вас не должно быть никаких код в нем, как вы делаете), и в вашей обертке есть некоторая логика обновления (которой, как отмечалось, не должно быть), которая, вероятно, действительно обновляет что-то, что связано с привязкой, заставляя вас думать, что она «работает».

Если вам требуется дополнительная логика для изменения свойства, добавьте обратный вызов DependencyPropertyChanged к регистрации метаданных поля.

... new UIPropertyMetadata(0, SelectedPageChanged);

private static void SelectedPageChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var @this = (DataBaseSettings)sender;
    if (NavigationCommands.Refresh.CanExecute(null, @this))
        NavigationCommands.Refresh.Execute(null, @this);
}
...