4. Windows Phone 8 App
Windows 8 App
XAML UI
Framework
.NET Code
(C#; VB.NET)
Windows Runtime
APIs
DirectX 11
Native Interop
Component
Windows Runtime
APIs
Partner Runtimes & Game Engines
IE10 Web Browser Control
Partner Runtime Engines
5. Separar lógica de interfaz de usuario y la aplicación utilizando el
patrón de MVVM
Compartir funcionalidad utilizando bibliotecas de clases de portables
Compartir código con Archivos Enlazados
Manejo de las diferencias de plataforma de Windows Phone y
Windows 8
Compartir utilizando componentes Windows Runtime
6.
7.
8. 1. Un origen
2. Un proyecto
3. Un ensamblado
Multiples plataformas
19. View
Data Bindings
Interfaz de Usuario
Commands
One way
One time
Two way
ViewModel
Estructuras que
representan los contextos
de datos de las pantallas y
el que permiten el acceso
a la logica de negocio
Model
Clases con solo
propiedades que
representan las fuentes de
los datos (archivos,
servicios, bases de datos)
20. Aplicaciones XAML
Este es el escenario “típico” de un
desarrollador .NET hasta antes de
XAML o MVC”
Etiqueta
Caja de texto
Aplicaciones de escritorio, web forms
Etiqueta
Caja de texto
MainPage.xaml
(Lenguaje declarativo XAML)
Form.cs (Code behind C#)
Form.designer.cs (C#)
Clase
Form
MainPage.xaml.cs (Code behind C#)
Clase
MainPage
21. Usando XAML se pueden crear de forma declarativa los mismos
elementos gráficos que se crearían en código
<StackPanel>
<TextBox/>
<Button/>
</StackPanel>
StackPanel stackPanel = new StackPanel();
TextBox textBox = new TextBox();
stackPanel.Children.Add(textBox);
Button button = new Button();
stackPanel.Children.Add(button);
22. Ambos escenarios permiten acceder a los controles de la pantalla como
miembros de la clase que los contiene es decir
this.txtMensaje.Text = “Hola”;
Y crear event handlers para poner el código relacionado a una interacción del
usuario, por ejemplo el click de un botón
private void Button_Click(object sender, RoutedEventArgs e)
{ //Code }
Ahora bien, el que esto se permita no significa que sea la práctica “sugerida”.
23. View (XAML y Code behind)
Data Bindings
Commands
ViewModel
Model
Trabajar con MVVM es una de las
estrategias cross platform cuyo primer
paso es entender en que parte se ubica
nuestro “anterior” esquema de trabajo.
Como podemos observar, trabajar de la
forma típica no es más que trabajar sobre
las vistas. ¿Funciona? Si, pero no es la
practica correcta.
Algunos desarrolladores alcanzan a llegar
hasta implementar Vistas Modelos como
contextos de datos, sin embargo los
manipulan desde el code behind, lo que
es inapropiado.
32. class Class Model
MainView Model
«binding»
«binding»
Task's List
«boundary»
CategoryView Model
TaskView Model
Add/Modify Task
«boundary»
Fuente: http://www.slideshare.net/soreygarcia/planificando-las-bases-de-una-aplicacin-windows-phone
33. public class ItemViewModel : INotifyPropertyChanged
{
private string lineOne;
public string LineOne
{
get { return lineOne; }
set {
if (value != lineOne)
{
lineOne = value;
NotifyPropertyChanged("LineOne");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
if (null != PropertyChanged)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
34.
35. public class MainViewModel : BindableBase
{
private String nombre;
public String Nombre
{
get
{
return this.nombre;
}
set
{
Set<String>(ref nombre, value);
}
}
36. private static HueClientViewModel hueClientVM = null;
public static HueClientViewModel HueClientVM
{
get{
if (hueClientVM == null)
hueClientVM = new HueClientViewModel();
return hueClientVM;
}
}
public HueClientView()
{
InitializeComponent();
this.DataContext = App.HueClientVM;
}
52. public class MainViewModel
{
private DataService dataSvc;
public MainViewModel()
{
dataSvc= new DataService();
}
public void XYZmethod()
{
var theCar = dataSvc.Car;
...
NavigationService.Instance.GoBack();
}
...
}
59. public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); // Using SimpleIOC
// Register Services
if (ViewModelBase.IsInDesignModeStatic)
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
else
SimpleIoc.Default.Register<IDataService, DataService>();
SimpleIoc.Default.Register<INavigationService, NavigationService>();
// Register ViewModels
SimpleIoc.Default.Register<MainViewModel>();
}
// Following property returns an instance of MainViewModel, with dependencies injected
public MainViewModel Main
{
get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
}
}