2015-06-29 5 views
2

Может быть не право титула на вопрос, но я попытаюсь объяснить: Мой TextBox уже привязан к собственности, как:Динамическое связывание?

class MyViewModel : INotifyPropertyChanged 
    public string TextVal 
    { 
     get 
     { 
      if (View != null) 
        { 
         return View.Model.TextForValueField; // other satrts 
        } 
       return defaultModel.TextForValueField;// first start 

     set 
     { 
      .....//some setters logic with View.Model.TextForValueField 
     } 
    } 

Когда программа начинает не открыто, так геттер связывает значение из поле для значения в модели по умолчанию, и это правильно, но затем, когда я открываю новый View , мой геттер правильно возвращает значения из соответствующего View.Model.TextForValueField, но в поле TextBox на моем ленточном меню окна отображается начальное значение из модели по умолчанию (?) Зачем?? XAML для связывания является:

<Setter Property="Text" Value="{Binding MyViewModel.TextVal, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

Возможно, есть способ вызова поглотителя еще раз, когда начинается View? Что-то вроде «Обновить» для лент?

Моя собственность функция

protected void RaisePropertyChanged(string propName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propName)); 
      } 
     } 
+1

Вы должны реализовать интерфейсы INotifyPropertyChanged, если ваши свойства программно изменяются, чтобы обновить элементы управления графическим интерфейсом. – mcy

+0

Позвольте мне перефразировать ваш вопрос, когда «TextForValueField» изменен, ваш «TextBox» (привязанный к «TextVal') не обновляется, правильно? – Sinatr

+1

Вы вызываете свой метод 'RaisePropertyChanged' в' set' accessor, правильно? – mcy

ответ

1

изменилось Когда вы вперед Модель недвижимости через ViewModel собственности вы должны нести на своих обновлений вручную.

public class Model 
{ 
    public string Property {get; set;} 
} 

public class ViewModel 
{ 
    public string BindProperty 
    { 
     get { return modelInstance.Property; } 
     set 
     { 
      modelInstance.Property = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

При привязке к BindProperty вашему взгляду не уведомлен когда Model.Property получает изменился.

Одно из возможных решений заключается в том, чтобы сделать Model осуществить INotifyPropertyChanged тоже и переслать это уведомление. Другое (не рекомендуется) связывается с Model.Property напрямую (модель еще должна реализовать INotifyPropertyChanged).

public class Model: NotifyPropertyChangedBase 
{ 
    private string _property; 
    public string Property 
    { 
     get { return _property; } 
     set 
     { 
      _property = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

public class ViewModel: NotifyPropertyChangedBase 
{ 
    public string BindProperty 
    { 
     get { return modelInstance.Property; } 
     set 
     { 
      modelInstance.Property = value; 
      OnPropertyChanged(); 
     } 
    } 

    public ViewModel() 
    { 
     modelInstance.PropertyChanged += Model_PropertyChanged; 
    } 

    void Model_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     // forward change notification to View 
     if(e.PropertyName == "Property") 
      OnPropertyChanged("BindProperty"); 
    } 
} 

public abstract class NotifyPropertyChangedBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged([CallerMemberName] string property = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 
} 
+0

Не могли бы вы предоставить свой код функции OnPropertyChanged? Кажется, что мой кодовый бесконечный цикл в этой функции теперь = ( – curiousity

+0

См. Edit. Возможно, вы каким-то образом вызвали рекурсию? Вы можете задать * новый вопрос * об этой проблеме, просто не забудьте подготовить вопрос в [MCVE] (http: //stackoverflow.com/help/mcve). – Sinatr

+0

..но это не сохранить мое приложение. значения все еще заморожены - кажется, что (может быть) что-то не так с пересылкой изменений уведомлений на просмотр в моем случае – curiousity

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