Обновление View через связывание не работает - PullRequest
0 голосов
/ 25 октября 2011

У меня проблема с обновлением макета моего списка с помощью MVVM с Prism 4.0.

У меня нет проблем с отображением моей наблюдаемой коллекции в моем списке, но когда я связываю его с DelegateCommand для добавления нового пользователя или обновления выбранного элемента списка, он не обновляется, но базовый объект обновляется. Я попытался использовать MessageBox.Show, чтобы получить последние данные, и он внес изменения, но в view.xaml он не обновляется.

public class ProfileViewModel : DependencyObject
{
 public DelegateCommand SaveCommand { get; set; }
 public ObservableCollection<Persons> Persons { get; set; }

 public ProfileViewModel()
 {
   CreatePerson();
   SaveCommand = new DelegateCommand(Save,CanSave);
 }

 private void Save()
 {
   Person[0].LastUpdated = DateTime.Now
   Persons.Add(new Persons { FIrstName = "Bob", LastName "Bob," LastUpdated=DateTime.Now});
 }

 private bool CanSave()
 {
  return true;
 }

 public void CreatePerson()
 {
   this.Persons = new ObservableCollection<Persons>();
   Persons.Add(new Persons { FirstName = "John", LastName = "Doe", LastUpdated = DateTime.Now});Persons.Add(new Persons { FirstName = "John", LastName = "Doe", LastUpdated = DateTime.Now});
Persons.Add(new Persons { FirstName = "John", LastName = "Doe", LastUpdated = DateTime.Now});
 }
}
}

ProfilePage.Xaml

<ListBox ItemsSource="{Binding Persons}" Name="ListBoxItem">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding FirstName}"/>
                            <TextBlock Text="{Binding LastName}" />
                            <Button Content="_Save" Command={Binding Source={Static Resource ProfileViewModel{, Path=SaveCommand}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

ProflilePage.xaml.cs

 public partial class ProfilePage : Window
 {
   private ProfileViewModel _vm;

   [Dependency]
   public ProfileViewModel VM
   {
     set { _vm = value; this.DataContext = _vm; }
   }

   public ProfilePage()
   {
     InitializeComponent();
   }

App.xaml.cs

protected override void OnStartup(StartupEventArgs e)
 {
   IUnityContainer container = new UnityContainer();
   ProfileViewModel source = new ProfileViewModel();
   ProfilePage window = container.Resolve<ProfilePage>();
   window.show();
 }

Класс My Persons реализует INotifyPropertyChanged и имеет установщик-получатель LastName, FirstName и LastUpdated.

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Если я правильно смотрю на это, вам нужно также реализовать INotifyPropertyChanged на ВМ.Представление не может видеть события, запущенные из модели.

0 голосов
/ 25 октября 2011

Я почти уверен, что вам нужен DataContextProxy для работы привязок. Привязка ElementName также будет работать на ListBox

...