2016-03-08 1 views
1

У меня есть две панели стека, одна из которых имеет набор данных datacontext, а дочерние элементы управления внутри нее привязаны к свойствам объекта. Вторая панель стека не имеет привязки данных, но дочерний элемент управления ссылается на объект и свойство.Изменения в WPF ViewModel не обновлены для дочерних элементов управления, содержащихся в родительском элементе управления с набором данных datacontext

При обновлении объекта в режиме просмотра изменения, внесенные в имя и фамилию, отображаются во второй панели стека, но ничего не меняется в первом, и я не понимаю, почему? Кто-нибудь имеет какие-либо советы относительно того, почему это будет указано, что при первом загрузке приложения на обеих панелях отображаются правильные данные, проблема возникает только в том случае, если изменение производится с помощью модели viewmodel.

XAML:

<Grid> 
    <StackPanel> 
     <StackPanel DataContext="{Binding Person}"> 
      <TextBlock Text="{Binding FirstName}"></TextBlock> 
      <TextBox Text="{Binding LastName}"></TextBox> 
      <Button Command="{Binding DataContext.Commands.Update, ElementName=mainView}" VerticalAlignment="Bottom" Margin="0 0 0 20">Update</Button> 
     </StackPanel> 
     <StackPanel> 
      <TextBlock Text="{Binding Person.FirstName}"></TextBlock> 
      <TextBox Text="{Binding Person.LastName}"></TextBox> 
     </StackPanel> 
    </StackPanel> 
</Grid> 

прилагается копия всего решения, которое демонстрирует проблему можно найти here.

Любая помощь очень ценится!

+0

могли бы вы показать нам ViewModel тоже? –

+0

Извините, что забыл добавить ссылку, которую я сейчас добавил. –

+1

Я проверил ваш код - ваш класс 'Person' также должен реализовывать' INotifyPropertyChanged', а его свойства 'FirstName' и' LastName' должны поднять событие PropertyChanged. Я считаю, что исправление этого должно решить вашу проблему. – Grx70

ответ

0

Я сделал XAML как это:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel> 
      <StackPanel DataContext="{Binding Person}" > 
       <TextBlock Text="{Binding FirstName}" ></TextBlock> 
       <TextBox Text="{Binding LastName}" ></TextBox> 
       <Button Command="{Binding DataContext.Commands.Update, ElementName=mainView}" VerticalAlignment="Bottom" Margin="0,0,0,20" Width="75">Update</Button> 
      </StackPanel> 
      <StackPanel > 
       <TextBlock Text="{Binding Person.FirstName}"></TextBlock> 
       <TextBox Text="{Binding Person.LastName}"></TextBox> 
      </StackPanel> 
     </StackPanel> 
    </Grid> 
</Window> 

и в коде позади я сделал это:

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataContext = new MainViewModel() 
      { 
       Person = new Person() { FirstName = "Bruce", LastName = "Lee" } 
      }; 
     } 
    } 

and..it работает!

это MainViewModel:

public class MainViewModel : ViewModelBase 
    { 
     private Person person; 
     public Person Person 
     { 
      get { return person; } 
      set 
      { 
       if (person != value) 
       { 
        person = value; 
        OnPropertyChanged("Person"); 
       } 
      } 
     } 
    } 

, а затем, это человек класс

public class Person : ViewModelBase 
{ 
    private string lastName; 
    public string LastName 
    { 
     get { return lastName; } 
     set 
     { 
      if (lastName != value) 
      { 
       lastName = value; 
       OnPropertyChanged("LastName"); 
      } 
     } 
    } 

    private string firstName; 
    public string FirstName 
    { 
     get { return firstName; } 
     set 
     { 
      if (firstName != value) 
      { 
       firstName = value; 
       OnPropertyChanged("FirstName"); 
      } 
     } 
    } 

} 

Надеется, что это помогает

+0

Но где/когда вы вносите изменения в 'FirstName' и/или' LastName' (это часть, с которой сталкивается OP)? – Grx70

+0

Вы не можете вносить изменения в FirstName из пользовательского интерфейса, потому что это TextBlock, но из ViewModel вы можете его изменить. (в другом смысле это Binding - OneWay .. Я дам вам классы MainViewModel и Person – Coding4Fun