Ikatan rusak dengan pendekatan Prism, Silverlight, dan ViewFirst

Masalah yang kami alami adalah kami tidak dapat mengikat untuk berfungsi di aplikasi prisma silverlight kami saat menggunakan pendekatan model tampilan pertama. Pendekatan tampilan pertama berfungsi dengan baik. Kami telah memeriksa dokumentasi resmi dan berbagai situs web, namun masih belum menyelesaikan masalah tersebut. Di bawah ini adalah kode untuk model tampilan pertama dan pendekatan tampilan pertama. Apakah kita melewatkan sesuatu? Baca tentang hal ini di blog saya http://silvercasts.blogspot.com

Pendekatan pertama View-Model:

Bootstrap:

   internal void RegisterLoginRegionAndView()
   {
       IRegionManager regionManager = Container.Resolve<IRegionManager>();

       regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion,
       () => Container.Resolve<IViewModel>().View);
    }

Model Tampilan:

   public ViewModel(IView view)
   {
       View = view;
       View.SetModel(this);

       User = new User();
       User.Username = "TestUser";
   }

Antarmuka Model Tampilan:

 public interface IViewModel
   {
       IView View { get; set; }
   }

Lihat Antarmuka:

public interface IView
   {
       void SetModel(IViewModel model);
   }

Lihat Xaml:

 <TextBox x:Name="Username" TextWrapping="Wrap" Text="{Binding User.Username}" />

Lihat Kode Dibalik:

public void SetModel(IViewModel viewModel)
   {
       this.DataContext = viewModel;
   }

Lihat pendekatan pertama

Bootstrap:

regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion, typeof(IView));

Model Tampilan:

  public ViewModel()
   {
       User = new User();
       User.Username = "TestUser";
   }

Lihat Kode Dibalik:

public View(IViewModel viewModel)
   {
       InitializeComponent();
       this.DataContext = viewModel;
   }

person cmaduro    schedule 23.09.2009    source sumber


Jawaban (3)


Penerapan SetModel pada pandangan Anda harus sebagai berikut:

public void MyUserControl : UserControl, IView
{
     //...
     public void SetModel(IViewModel vm)
     {
          this.DataContext = vm;
     }
}

Jika tidak ada, maka harus ada (Anda belum memposting penerapan SetModel, namun dalam kasus ini ini akan menjadi sumber masalahnya).

Jika bukan ini masalahnya, kemungkinan ViewModel Anda tidak mengimplementasikan INotifyPropertyChanged. Saya biasanya menggunakan ViewModel dasar yang melakukan ini:

public class ViewModelBase : INotifyPropertyChanged
{
     public event PropertyChangedEventHandler PropertyChanged;
     public void OnPropertyChanged(string propertyName)
     {
          if(PropertyChanged != null)
          {
               PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
     }
}

Dan semua ViewModel saya berasal dari itu:

public class MyViewModel : ViewModelBase
{
     private User _user;
     public User User
     {
         get { return _user; }
         set
         {
              _user = value;
              OnPropertyChanged("User");
         }
     }
}

Catatan: dalam kasus Anda, objek "Pengguna" mungkin juga berupa ViewModel dan juga memunculkan OnPropertyChanged untuk properti Nama Pengguna.

Semoga ini membantu.

person Anderson Imes    schedule 23.09.2009
comment
Saya melakukannya tetapi formatnya menjadi kacau. Itu tepat di bawah kode XAML. Tapi dari kelihatannya, terlihat bagus. Terima kasih! - person cmaduro; 24.09.2009

Perbedaan yang jelas bagi saya adalah Anda menyetel DataContext dalam pendekatan "lihat dulu", tetapi tidak dalam pendekatan "lihat model terlebih dahulu". Saya tidak yakin apakah Prism menyetel DataContext untuk Anda (saya rasa Anda berasumsi demikian) tetapi coba atur DataContext secara manual untuk melihat apakah ini masalahnya. Di konstruktor ViewModel, Anda memanggil View.SetModel(this) - apakah panggilan itu mengatur DataContext?

person James Cadd    schedule 23.09.2009

Masalahnya adalah saya menggunakan metode SetModel sebelum objek data dibuat. Memindahkannya seperti ini:



       public ViewModel(IView view)
       {
           View = view;

           User = new User();
           User.Username = "TestUser";

           View.SetModel(this);
       }

memecahkan masalah.

person cmaduro    schedule 24.09.2009
comment
Hal ini menyebabkan masalah karena ViewModel Anda tampaknya tidak mengimplementasikan INotifyPropertyChanged dengan benar. Ini seharusnya tidak menjadi masalah. Saya akan memperbarui tanggapan saya dengan beberapa kata-kata tambahan mengenai hal ini. - person Anderson Imes; 24.09.2009