2015-07-27 14 views
1

У меня есть класс с именем ProfileViewModel, который состоит из простых свойств, как так:Как реализовать двустороннюю привязку данных?

class SomeViewModel : INotifyPropertyChanged 
    { 
     private Foo foo; 
     public Foo Foo 
      { 
       get { return foo; } 
      } 

     public string Bar 
      { 
       get { return foo.bar; } 
       set 
        { 
         foo.bar = value; 
         NotifyPropertyChanged ("Bar"); 
        } 
      } 

      // More properties like the above 

     public event PropertyChangedEventHandler PropertyChanged; 
      protected void NotifyPropertyChanged (string Info) 
    { 
    if (PropertyChanged != null) 
     { 
     PropertyChanged (this, new PropertyChangedEventArgs (Info)); 
     } 
    } 

я удалил некоторые биты, которые на самом деле не важно. Теперь я пытаюсь создать двустороннюю привязку между некоторыми текстовыми полями и свойствами указанного класса, но ничего не работает. В XAML я попытался как:

 <TextBox Margin="5, 25, 5, 0" VerticalAlignment="Top" Height="25" Name="BarField" 
       Text="{Binding CurrentFoo.Bar}"/> 

и

 <TextBox Margin="5, 75, 5, 0" VerticalAlignment="Top" Height="25" Name="BarField" 
       Text="{Binding Bar, ElementName=CurrentFoo}"/> 

ни один из которых в настоящее время работает (независимо установлен ли я, чтобы быть Two-Way или нет), так как ничто не появляется в текстовом поле, а также не изменение текста в текстовом поле влияет на объект CurrentFoo. Что именно я делаю неправильно? Что здесь отсутствует? Нужно ли мне делать привязку в коде?

+0

Вы пытались: Text = "{Binding Bar, ElementName = CurrentFoo, Mode = TwoWay}" – Ugur

+0

Свойство TextBox 'Text' - это TwoWay по умолчанию, не нужно указывать его в Binding. – almulo

+0

Да, я отредактировал сообщение, потому что забыл упомянуть, что – MKII

ответ

2

Для вашей первой привязки к работе ваше свойство Foo должно быть прочитано/записано, в настоящее время оно только для чтения.

Для второго подхода вам не нужно устанавливать ELEMENTNAME, только режим porperty:

<TextBox Text="{Binding Bar, Mode=TwoWay}"/> 

Примечание: Я предпочитаю первый.

+0

Да, когда я удалил 'ElementName', это сработало. Большое спасибо. – MKII

+0

Вы используете ElementName для ссылки на именованный элемент управления в вашем представлении, а не на свойство ViewModel. –

+0

Нет необходимости в 'Mode = TwoWay'. По умолчанию атрибуты свойств TextBlock имеют значение TwoWay. – almulo

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