2015-03-18 4 views
0

Я перемещаю свой проект в шаблон MVVM, но привязка не работает. Ниже приведен код моего проекта. Проблема заключается в том, что текстовое поле не обновляется со значением, когда новый объект создается в LRViewModel.cs, но в окне сообщений появляется всплывающее окно с указанием того, что свойство изменено, но это не обновляет текстовое поле.Как правильно привязать текстовое поле с помощью MVVM

LoginRegister.xaml.cs:

using CSMS_MVVM.ViewModels; 
private LrViewModel _lrViewModel; 
public LoginRegister() 
     { 
      InitializeComponent(); 
     } 
private void Page_Loaded_1(object sender, RoutedEventArgs e) 
     { 
      _lrViewModel = new LrViewModel(); 
      this.DataContext = _lrViewModel; 
     } 

LoginRegister.xaml

. 
. 
. 
<TextBox Name="regID" Text="{Binding RegId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Padding="8" Margin="15,110,20,0" VerticalAlignment="Top" BorderBrush="#FFD4F1FF" FontSize="15" ToolTip="Username or Employee ID" FontFamily="Calibri" /> 
. 
. 
. 

LRViewModel.cs

using CSMS_MVVM.Models; 

namespace CSMS_MVVM.ViewModels 
{ 
    class LrViewModel 
    { 
     public LrModel LrModel { get; set; } 

     public LrViewModel() 
     { 
      LrModel=new LrModel 
      { 
       RegId = "Value" 
      }; 
     } 
    } 
} 

LrModel.cs

namespace CSMS_MVVM.Models 
{ 
    class LrModel : INotifyPropertyChanged 
    { 
     private String _regId; 

     public String RegId 
     { 
      get { return _regId; } 
      set 
      { 
       _regId = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("RegId")); 
      } 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, propertyChangedEventArgs); 
      MessageBox.Show("Here"); 
     } 

     #endregion 

    } 
} 

ответ

2

вы должны изменить для этого ..

<TextBox Name="regID" Text="{Binding LrModel.RegId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Padding="8" Margin="15,110,20,0" VerticalAlignment="Top" BorderBrush="#FFD4F1FF" FontSize="15" ToolTip="Username or Employee ID" FontFamily="Calibri" /> 

.

Поскольку свойство, которое вы хотите связать, на самом деле является свойством модели, а модель - это свойство на вашей модели вида. Вам следует привязать к Model.PropertyName .. и когда model.Property закроет свое свойство. UI будет обновлен.

- Предложение -

Вы никогда не должны установить DataContext в вашем заднем конце C# код. Вместо этого (в этом случае) вы можете установить DataContext из XAML.

<Window 
    xmlns:ViewModels="clr-namespace:TheNamespaceWhereYourViewModelIs" 
    ... 
    > 
    <Window.DataContext> 
     <ViewModels:YourViewModel/> 
    </Window.DataContext> 
+0

Вы не должны устанавливать «DataContext» из кода задней части, вы создаете зависимость. Вместо этого установите его в XAML или просто передайте корневой элемент «x: Name» и используйте «Binding.ElementName», чтобы указать там, если «DataContext» уже установлен в другом месте. –

+0

или лучше использовать некоторую фреймворк действительно .. но op сказал mvvm :) – Muds

+0

Вам действительно не нужна фантастическая структура, чтобы заставить MVVM работать на вас, всего несколько простых базовых классов и избегать вредных привычек, таких как установка 'this.DataContext = this; 'в вашем конструкторе элементов управления :-) –

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

  • Нет связанных вопросов^_^