Pregunta

El problema que estamos teniendo es que no podemos conseguir la unión a trabajar en nuestra aplicación silverlight prisma cuando se utiliza la vista-modelo primero acercarse a, aproximarse. La vista primera multa enfoque de trabajo. Hemos pasado el documentación oficial y varios sitios web, pero aún no han resuelto el problema. A continuación se muestra el código tanto para la vista-modelo en primer lugar, y la vista primera aproximación. Nos estamos perdiendo algo? Leer sobre ello en mi blog http://silvercasts.blogspot.com

Vista-Modelo primera aproximación:

Bootstrapper:

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

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

modelo de vista:

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

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

modelo de vista de interfaz:

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

Vista Interfaz:

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

Ver XAML:

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

Ver código Detrás:

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

Ver primera aproximación

Bootstrapper:

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

modelo de vista:

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

Ver código Detrás:

public View(IViewModel viewModel)
   {
       InitializeComponent();
       this.DataContext = viewModel;
   }
¿Fue útil?

Solución

Su puesta en práctica de SetModel en su vista tiene que ser de la siguiente manera:

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

Si eso no es allí, es necesario que haya (no se ha publicado su implementación de SetModel, pero este sería el origen del problema en este caso).

Si este no es el problema, lo más probable debido a que su modelo de vista no implementa INotifyPropertyChanged. Yo suelo usar un modelo de vista de base que hace esto:

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

Y entonces todos mis ViewModels derivan de lo siguiente:

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

Nota:. en su caso, el objeto "Usuario" debe probablemente también ser un modelo de vista y también aumentar OnPropertyChanged para la propiedad Nombre de usuario

Espero que esto ayude.

Otros consejos

La diferencia obvia para mí es que se establece el DataContext en el enfoque de "primera vista", pero no en el "modelo de vista primero". No estoy seguro de si Prisma establece el DataContext para ti (supongo que usted está asumiendo que lo haga) pero trata de establecer el DataContext manualmente para ver si este es el problema. En el constructor de modelo de vista se llama View.SetModel (este) - hace que el establecimiento de llamada DataContext

El problema era que yo estaba usando el método setModel antes de que se instanciado el objeto de datos. Moviéndolo como esto:

       public ViewModel(IView view)
       {
           View = view;

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

           View.SetModel(this);
       }

resolvió el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top