2013-03-25 5 views
11

Я хочу связывать серию TextBoxes в сетке в свойства объекта который сам по себе еще одно свойство в моем ViewModel (The DataContext).привязки к свойству объекта

CurrentPerson состоит из Name и Age свойств

Внутри ViewModel:

public Person CurrentPerson { get; set ... (with OnPropertyChanged)} 

XAML:

<TextBox Text="{Binding Name}" > 
<TextBox Text="{Binding Age}" > 

Я не был уверен, что на подходе использовать, я установил другой DataContext в области сетки, без каких-либо результатов. Также попробовал s трассировка источника и пути, например Source = CurrentPerson, Path = Age, без каких-либо результатов, они были для проб и выяснили, будут ли какие-либо изменения или нет.

Как этого добиться?

ответ

17

Разместил (а): Person членов класса Name и Age поднять INPC самостоятельно?

Если вы хотите обновить значение или Name или Age в ViewModel и он отражает в представлении, вам нужно их поднять свойство индивидуально изменилось внутри Person класса, а также.

Связи в порядке, но вид в значительной степени не сообщается об изменениях из модели представления. Также помните, что UpdateSourceTrigger для TextBox по умолчанию - LostFocus. Установка этого параметра на PropertyChanged будет обновлять вашу строку в ViewModel в качестве вашего ввода.

Простой пример:

public class Person : INotifyPropertyChanged { 
    private string _name; 
    public string Name { 
    get { 
     return _name; 
    } 

    set { 
     if (value == _name) 
     return; 

     _name = value; 
     OnPropertyChanged(() => Name); 
    } 
    } 

    // Similarly for Age ... 
} 

Теперь ваш XAML будет:

<StackPanel DataContext="{Binding CurrentPerson}"> 
    <TextBox Text="{Binding Name}" /> 
    <TextBox Margin="15" 
      Text="{Binding Age}" /> 
</StackPanel> 

или вы можете также связать как предложено @Kshitij

<StackPanel> 
    <TextBox Text="{Binding CurrentPerson.Name}" /> 
    <TextBox Margin="15" 
      Text="{Binding CurrentPerson.Age}" /> 
</StackPanel> 

и обновить вид модели, как ваш ввод

<StackPanel DataContext="{Binding CurrentPerson}"> 
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Margin="15" 
      Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" /> 
</StackPanel> 
+0

Понял, спасибо – LastBye

12

Попробуйте это:

<TextBox Text="{Binding CurrentPerson.Name}" /> 
<TextBox Text="{Binding CurrentPerson.Age}" /> 

По существу, вы можете перейти в свойства, используя . сепаратор.

Для дальнейшего использования, если вы хотите, чтобы развернуть в коллекции, вы можете использовать MyCollection[x] так же, как вы бы в коде (где х будет заменен на жестко прописанных числом, не переменная).

+0

+1 и спасибо за информацию, не были уверены, что в части Xaml я могу использовать это, но я думаю, что я тоже пробовал этот путь.Снова этот подход не имел результата, CurrentPerson определен и запускает NotifyPropertyChanged, но, возможно, там что-то отсутствует. – LastBye

+0

Кажется, что изменение Уведомления не будет действовать таким образом. Это правда ? как я должен это исправить? – LastBye

+0

Не работал для меня. не знаю, почему ... – LastBye

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