2015-12-15 6 views
0

Я создал пользовательский UserControl. После blog post мой код-за контроль выглядит следующим образом:Связывание внутри UserControl

public BasicGeoposition PinGeoposition 
{ 
    get { return (BasicGeoposition) GetValue(PropertyPinGeoposition); } 
    set { SetValueDp(PropertyPinGeoposition, value);} 
} 

public static readonly DependencyProperty PropertyPinGeoposition = 
    DependencyProperty.Register("PinGeoposition", typeof(BasicGeoposition), typeof(CustomMapControl), null); 

public event PropertyChangedEventHandler PropertyChanged; 
void SetValueDp(DependencyProperty property, object value, [System.Runtime.CompilerServices.CallerMemberName] String p = null) 
{ 
    ViewModel.SetMode(ECustomMapControlMode.Default); 
    SetValue(property, value); 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(p)); 
} 

Использование моего контроля:

<customControls:CustomMapControl Mode="ForImage" PinGeoposition="{Binding Geoposition, Mode=TwoWay}" Grid.Row="1"/> 

Наконец в ViewModel этих страниц, где я использую свой контроль у меня есть:

public BasicGeoposition Geoposition 
{ 
    get { return _geoposition; } 
    set 
    { 
     if (Set(ref _geoposition, value)) 
     { 
      RaisePropertyChanged(() => Geoposition); 
     } 
    } 
} 

Я ожидаю, что каждое изменение геопозиции в ViewModel будет отражено в SetValueDp. К сожалению, это не сработает.

+0

Вы создали * DataContext *? Вы отлаживали, чтобы узнать, что происходит в коде? Я подозреваю, что * SetValueDp * запускается только тогда, когда вы создаете привязку - настройте свойство зависимостей после этого нормального связывания. – Romasz

+0

Я установил DataContext в файл xaml, потому что мой элемент управления основан на ViewModel. SetValueDp никогда не запускается. – pbalut

ответ

3

Не уверен, что Джерри Никсон пытался сделать в своей статье в блоге, так как он не назначал свой метод SetValueDp в любом месте.

Если вы хотите, чтобы она вызывалась, вы можете сделать что-то подобное:

public static readonly DependencyProperty PropertyPinGeoposition = 
DependencyProperty.Register("PinGeoposition", typeof(BasicGeoposition), typeof(CustomMapControl), new PropertyMetadata(null, SetPosition)); 

public BasicGeoposition PinGeoposition 
{ 
    get { return (BasicGeoposition) GetValue(PropertyPinGeoposition); } 
    set { SetValue(PropertyPinGeoposition, value);} 
} 

private static void SetPosition(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    var control = (CustomMapControl)sender; 

    var position = e.NewValue as BasicGeoposition; 

    // Do whatever 
} 

Edit: После прочтения и перечитывая статью в блоге, я думаю, что я получил его назад (и вы тоже, наверное). Из того, что я сейчас понимаю, SetValueDp - это вспомогательный метод, который вы должны вызывать, когда хотите изменить значение свойства зависимостей. Это не то, что называется автоматически. Поэтому, если вы хотите, чтобы метод вызывался всякий раз, когда был изменен DP, проверьте мое решение.

+1

Кажется, что Джерри звонит * SetValueDp * в сеттеру PinGeoposition - он обменивал SetValue с ним. – Romasz

+0

@ Romasz Хорошо пятнистый. Тем не менее, установщик вызывается только при попытке обновить свойство вручную, а не из привязки. Итак, я думаю, @pbalut все равно нужно использовать 'PropertyMetadata' для своего использования. –

+0

Как должен выглядеть мой PinGeoposition в коде? 'public BasicGeoposition PinGeoposition { get {return (BasicGeoposition) GetValue (PropertyPinGeoposition); } set {SetValue (PropertyPinGeoposition, value);} } '? – pbalut

Смежные вопросы