APLIKASI MENGGUNAKAN DESIGN PATTERN MVVM
UJIAN AKHIR SEMESTER
Pemrograman Lanjut
DISUSUN OLEH :
Nanda Atika Hariani 17.11.1701
PRODI INFORMATIKA
UNIVERSITAS AMIKOM YOGYAKARTA
YOGYAKARTA
2019
APLIKASI
Model
Pada model ini di deklarasikan Item penjualan yang terdiri atas Id, NamaBarang, Jumlah, Harga,
DiskonPersen, Total.
Variabel di atas akan menjadi variable utama kita.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace LatihanMVVM
{
public class ItemPenjualan
{
public ItemPenjualan()
{
DiskonPersen = 0;
}
public long Id { get; set; }
public string NamaBarang { get; set; }
public int Jumlah { get; set; }
public decimal Harga { get; set; }
public decimal DiskonPersen { get; set; }
public decimal Total()
{
decimal total = Jumlah * Harga;
return total - (DiskonPersen / 100 * total);
}
}
}
View
View di buat berdasarkan model yang telah di buat di atas view disini menggunakan tipe xml yang
di sebut xaml, view ini juga di dukung class c#
<Window x:Class="[Link]"
xmlns="[Link]
xmlns:x="[Link]
Title="MainWindow" Height="356" Width="528">
<[Link]>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="20" />
<Setter Property="FontFamily" Value="Myriad Pro" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Background">
<[Link]>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF508FC4" Offset="0" />
<GradientStop Color="#FF6F94AD" Offset="1" />
<GradientStop Color="#FFC7F3FF" Offset="0.302" />
</LinearGradientBrush>
</[Link]>
</Setter>
<Setter Property="Foreground">
<[Link]>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5252CE" Offset="0" />
<GradientStop Color="#FF0000DB" Offset="0.953" />
<GradientStop Color="#FF6363CB" Offset="0.337" />
</LinearGradientBrush>
</[Link]>
</Setter>
</Style>
<Style TargetType="Label">
<Setter Property="FontSize" Value="14" />
</Style>
<Style TargetType="TextBox">
<Setter Property="Language" Value="in-IN" />
<Setter Property="Template">
<[Link]>
<ControlTemplate>
<Border x:Name="customBorder"
Background="{TemplateBinding Background}" CornerRadius="5" BorderThickness="2"
BorderBrush="Gray">
<ScrollViewer x:Name="PART_ContentHost"/>
</Border>
<[Link]>
<Trigger Property="IsKeyboardFocused"
Value="True">
<Setter TargetName="customBorder"
Property="Effect">
<[Link]>
<DropShadowEffect BlurRadius="10"
ShadowDepth="0" Color="#578EC9"/>
</[Link]>
</Setter>
</Trigger>
<Trigger Property="IsKeyboardFocused"
Value="False">
<Setter Property="Foreground" Value="Gray" />
</Trigger>
</[Link]>
</ControlTemplate>
</[Link]>
</Setter>
</Style>
<Style TargetType="Button">
<Setter Property="Background" Value="#DEF2FC" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontSize" Value="15"/>
<Setter Property="Effect">
<[Link]>
<DropShadowEffect BlurRadius="10" ShadowDepth="0"
Color="#578EC9"/>
</[Link]>
</Setter>
<Setter Property="Template">
<[Link]>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="customBorder"
Background="{TemplateBinding Background}" CornerRadius="4" BorderThickness="2"
BorderBrush="Gray">
<ContentPresenter Content="{TemplateBinding
Content}" HorizontalAlignment="Center" />
</Border>
<[Link]>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#2394CC"
/>
<Setter Property="Foreground" Value="White"
/>
</Trigger>
<Trigger Property="IsPressed"
Value="True">
<Setter Property="Effect" Value="{x:Null}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Effect">
<[Link]>
<BlurEffect Radius="3" />
</[Link]>
</Setter>
</Trigger>
</[Link]>
</ControlTemplate>
</[Link]>
</Setter>
</Style>
</[Link]>
<Grid>
<Label Content="Nama Barang:" Height="29" HorizontalAlignment="Left"
Margin="0,49,0,0" Name="label2" VerticalAlignment="Top"
HorizontalContentAlignment="Right" Width="107" />
<TextBox Height="23" HorizontalAlignment="Stretch"
Margin="112,55,12,0" Name="textBox1" VerticalAlignment="Top" />
<Label Content="Jumlah:" Height="27" HorizontalAlignment="Left"
Margin="1,86,0,0" Name="label3" VerticalAlignment="Top" Width="106"
HorizontalContentAlignment="Right" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="113,90,0,0"
Name="textBox2" VerticalAlignment="Top" Width="62" />
<Label Content="Harga:" Height="28" HorizontalAlignment="Left"
Margin="12,122,0,0" Name="label4" VerticalAlignment="Top"
HorizontalContentAlignment="Right" Width="95" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="113,127,0,0"
Name="textBox3" VerticalAlignment="Top" Width="124" />
<Button Content="Simpan" Height="27" HorizontalAlignment="Left"
Margin="207,228,0,0" Name="button1" VerticalAlignment="Top" Width="82" />
<Label Content="Diskon (%):" Height="33" HorizontalAlignment="Left"
Margin="12,161,0,0" Name="label5" VerticalAlignment="Top"
HorizontalContentAlignment="Right" Width="95" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="113,165,0,0"
Name="textBox4" VerticalAlignment="Top" Width="62" />
<Label Content="Total:" Height="33" HorizontalAlignment="Left"
Margin="12,194,0,0" Name="label6" VerticalAlignment="Top"
HorizontalContentAlignment="Right" Width="95" />
<Label Content="Label" Height="28" HorizontalAlignment="Left"
Margin="113,194,0,0" Name="label7" VerticalAlignment="Top" Width="402" />
<TextBlock Height="28" HorizontalAlignment="Stretch" Name="textBlock1"
Text="Tambah Item Penjualan" VerticalAlignment="Top" TextAlignment="Center"
Margin="0,12,0,0" />
<[Link]>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFB7CEFF" Offset="0.192" />
<GradientStop Color="White" Offset="1" />
<GradientStop Color="#FF1648AD" Offset="0" />
</LinearGradientBrush>
</[Link]>
</Grid>
</Window>
Dari kode view yang Panjang di atas jika di generate akan menghasilkan tampilan seperti ini:
View Model
View model ini menampung nilai yang ada di views sehingga command tidak perlu mengakses
setiap control yang ada di view secara langsung
using System;
using [Link];
using [Link];
using [Link];
using [Link];
namespace LatihanMVVM
{
class ItemPenjualanViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ItemPenjualan model;
public ItemPenjualanViewModel(ItemPenjualan itemPenjualan = null)
{
[Link] = itemPenjualan ?? new ItemPenjualan();
}
public string NamaBarang
{
get { return [Link]; }
set
{
if (value != [Link])
{
[Link] = value;
PropertyChanged(this, new
PropertyChangedEventArgs("NamaBarang"));
}
}
}
public int Jumlah
{
get { return [Link]; }
set
{
if (value != [Link])
{
[Link] = value;
PropertyChanged(this, new
PropertyChangedEventArgs("Jumlah"));
PropertyChanged(this, new
PropertyChangedEventArgs("Total"));
}
}
}
public decimal Harga
{
get { return [Link]; }
set
{
if (value != [Link])
{
[Link] = value;
PropertyChanged(this, new
PropertyChangedEventArgs("Harga"));
PropertyChanged(this, new
PropertyChangedEventArgs("Total"));
}
}
}
public decimal DiskonPersen
{
get { return [Link]; }
set
{
if (value != [Link])
{
[Link] = value;
PropertyChanged(this, new
PropertyChangedEventArgs("DiskonPersen"));
PropertyChanged(this, new
PropertyChangedEventArgs("Total"));
}
}
}
public string Total
{
get
{
decimal? total = [Link]();
if (![Link])
{
return "-";
}
else
{
return [Link]("C");
}
}
}
public ItemPenjualan Model
{
get { return [Link]; }
}
}
}
Menghubungkan view , view model dan model
untuk menghubungkan ketiga komponen ini kita hanya perlu mengganti kode pada
[Link] menjadi seperti in dan ketiga komponen akan terhubung.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace LatihanMVVM
{
/// <summary>
/// Interaction logic for [Link]
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ItemPenjualanViewModel();
}
}
}
Binding
Perubahan pada view akan langsung di perbaharui dengan melakukan binding, pada kode program
ini dilakukan binding pada property Text milik TextBox untuk mengisi nama barang dengan
property NamaBarang milik ItemPenjualanModelView selaku source-nya. Secara
default, binding pada TextBox adalah two-way binding. Dengan demikian, setiap kali pengguna
mengubah nilai TextBox tersebut , maka (setelah lost focus) nilai
property [Link] akan diperbaharui. Begitu juga sebaliknya, bila saya
melakukan perubahan nilai [Link] di kode program, maka
isi TextBox tersebut akan diperbaharui.
...
<Label Content="Nama Barang:" ... />
<TextBox Name="textBox1" ... Text="{Binding Path=NamaBarang}"/>
<Label Content="Jumlah:" ... />
<TextBox ... Text="{Binding Path=Jumlah, StringFormat={}{0:#,0}}"/>
<Label Content="Harga:" ... />
<TextBox ... Text="{Binding Path=Harga,
StringFormat={}{0:C}}"/>
<Label Content="Diskon (%):" ... />
<TextBox ... Text="{Binding Path=DiskonPersen, StringFormat={}{0:#.#}}"/>
<Label Content="Total:" ... />
<Label .... Content="{Binding Path=Total}" />
Tampilan akhir aplikasi
di dalam tampilan ini semua komponen telah muncul dan dapat diisi sesuai dengan format
deklarasi variabel.