3

私たちが抱えている問題は、ビューモデルの最初のアプローチを使用すると、プリズムシルバーライトアプリケーションでバインディングを機能させることができないことです。ビューファーストアプローチは正常に機能します。公式ドキュメントとさまざまなWebサイトを確認しましたが、まだ問題は解決していません。以下は、ビューモデルファーストとビューファーストアプローチの両方のコードです。私たちは何かが欠けていますか?私のブログhttp://silvercasts.blogspot.comでそれについて読んでください

ビューモデルの最初のアプローチ:

ブートストラッパー:

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

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

ViewModel:

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

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

ViewModelインターフェイス:

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

ビューインターフェイス:

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

Xamlを表示:

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

背後にあるコードを表示:

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

最初のアプローチを見る

ブートストラッパー:

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

ViewModel:

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

背後にあるコードを表示:

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

3 に答える 3

2

ビューでの実装はSetModel次のようにする必要があります。

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

それが存在しない場合は、存在する必要があります ( の実装を投稿していませんがSetModel、この場合はこれが問題の原因になります)。

これが問題でない場合は、ViewModel が を実装していない可能性がありますINotifyPropertyChanged。私は通常、これを行う基本 ViewModel を使用します。

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

そして、すべての ViewModels はそれから派生します:

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

注:あなたの場合、「User」オブジェクトはおそらくViewModelでもあり、UsernameプロパティのOnPropertyChangedも発生させる必要があります。

お役に立てれば。

于 2009-09-23T18:02:55.517 に答える
0

私との明らかな違いは、「ビューファースト」アプローチではDataContextを設定しますが、「ビューモデルファースト」アプローチでは設定しないことです。PrismがDataContextを設定するかどうかはわかりませんが(おそらく設定されていると思います)、DataContextを手動で設定して、これが問題であるかどうかを確認してください。ViewModelコンストラクターでView.SetModel(this)を呼び出します-その呼び出しはDataContextを設定しますか?

于 2009-09-23T16:15:43.900 に答える
0

問題は、データ オブジェクトがインスタンス化される前に SetModel メソッドを使用していたことです。次のように移動します。


       public ViewModel(IView ビュー)
       {
           ビュー = ビュー;

           ユーザー = 新しいユーザー ();
           User.Username = "TestUser";

           View.SetModel(これ);
       }

問題を解決しました。

于 2009-09-24T12:27:36.037 に答える