Saya telah menemukan masalah dengan mengikat ke P asswordBox
. Tampaknya ini adalah risiko keamanan tetapi saya menggunakan pola MVVM jadi saya ingin memotong ini. Saya menemukan beberapa kode menarik di sini (adakah yang pernah menggunakan ini atau yang serupa?)
http://www.wpftutorial.net/PasswordBox.html
Secara teknis tampak hebat, tetapi saya tidak yakin bagaimana cara mengambil kata sandi.
Saya pada dasarnya memiliki properti LoginViewModel
untuk Username
dan Password
. Username
baik-baik saja dan berfungsi sebagaimana mestinyaTextBox
.
Saya menggunakan kode di atas seperti yang dinyatakan dan memasukkan ini
<PasswordBox ff:PasswordHelper.Attach="True"
ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
Ketika saya punya PasswordBox
sebagai TextBox
dan Binding Path=Password
kemudian properti di sayaLoginViewModel
diperbarui.
Kode saya sangat sederhana, pada dasarnya saya punya Command
untuk saya Button
. Ketika saya menekan itu CanLogin
dipanggil dan jika itu mengembalikan benar itu panggilan Login
.
Anda dapat melihat saya memeriksa properti saya di Username
sini yang berfungsi dengan baik.
Dalam Login
saya mengirim bersama untuk layanan saya Username
dan Password
, Username
berisi data dari saya View
tapi Password
adalahNull|Empty
private DelegateCommand loginCommand;
public string Username { get; set; }
public string Password { get; set; }
public ICommand LoginCommand
{
get
{
if (loginCommand == null)
{
loginCommand = new DelegateCommand(
Login, CanLogin );
}
return loginCommand;
}
}
private bool CanLogin()
{
return !string.IsNullOrEmpty(Username);
}
private void Login()
{
bool result = securityService.IsValidLogin(Username, Password);
if (result) { }
else { }
}
Inilah yang sedang saya lakukan
<TextBox Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}"
MinWidth="180" />
<PasswordBox ff:PasswordHelper.Attach="True"
ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
Aku punya saya TextBox
, ini tidak masalah, tetapi dalam saya ViewModel
yang Password
kosong.
Apakah saya melakukan sesuatu yang salah atau melewatkan satu langkah?
Saya meletakkan breakpoint dan cukup yakin kode masuk ke kelas pembantu statis tetapi tidak pernah memperbarui saya Password
di saya ViewModel
.
Jawaban:
Maaf, tapi Anda salah melakukannya.
Orang-orang harus memiliki tato pedoman keamanan berikut di bagian kelopak mata mereka:
Jangan pernah menyimpan kata sandi teks biasa dalam memori.
Alasan WPF / Silverlight
PasswordBox
tidak mengekspos DP untukPassword
properti terkait keamanan.Jika WPF / Silverlight ingin menyimpan DP untuk
Password
itu akan membutuhkan kerangka kerja untuk menjaga kata sandi itu sendiri tidak terenkripsi dalam memori. Yang dianggap vektor serangan keamanan cukup merepotkan. ItuPasswordBox
penggunaan dienkripsi memori (dari jenis) dan satu-satunya cara untuk mengakses password adalah melalui properti CLR.Saya menyarankan bahwa ketika mengakses
PasswordBox.Password
properti CLR Anda harus menahan diri untuk tidak menempatkannya dalam variabel apa pun atau sebagai nilai untuk properti apa pun.Menyimpan kata sandi Anda dalam teks biasa di mesin klien RAM adalah keamanan tidak-tidak.
Jadi singkirkan bahwa
public string Password { get; set; }
Anda sudah sampai di sana.Saat mengakses
PasswordBox.Password
, cukup keluarkan dan kirimkan ke server ASAP. Jangan menyimpan nilai kata sandi dan jangan memperlakukannya seperti yang Anda lakukan pada teks mesin klien lainnya. Jangan simpan kata sandi teks dalam memori.Saya tahu ini melanggar pola MVVM, tetapi Anda tidak boleh mengikat
PasswordBox.Password
DP Terlampir, menyimpan kata sandi Anda di ViewModel atau shenanigans serupa lainnya.Jika Anda mencari solusi over-architected, berikut ini:
1. Buat
IHavePassword
antarmuka dengan satu metode yang mengembalikan teks yang dihapus kata sandi.2. Mintalah Anda
UserControl
mengimplementasikanIHavePassword
antarmuka.3. Daftarkan
UserControl
instance dengan IoC Anda sebagai mengimplementasikanIHavePassword
antarmuka.4. Ketika permintaan server yang memerlukan kata sandi Anda sedang berlangsung, hubungi IoC Anda untuk
IHavePassword
implementasi dan hanya mendapatkan kata sandi yang banyak diidam-idamkan.Saya ambil saja.
- Justin
sumber
2 sen saya:
Saya mengembangkan dialog login yang khas (kotak pengguna dan kata sandi, ditambah tombol "Oke") menggunakan WPF dan MVVM. Saya memecahkan masalah pengikatan kata sandi dengan hanya meneruskan kontrol PasswordBox itu sendiri sebagai parameter pada perintah yang dilampirkan pada tombol "Ok". Jadi dalam pandangan saya:
Dan di ViewModel,
Execute
metode dari perintah terlampir adalah sebagai berikut:Ini sedikit melanggar pola MVVM karena sekarang ViewModel tahu sesuatu tentang bagaimana Lihat diimplementasikan, tetapi dalam proyek tertentu saya bisa membelinya. Semoga bermanfaat bagi seseorang juga.
sumber
Mungkin saya kehilangan sesuatu, tetapi sepertinya sebagian besar solusi ini terlalu rumit dan menghapus praktik yang aman.
Metode ini tidak melanggar pola MVVM dan mempertahankan keamanan lengkap. Ya, secara teknis itu adalah kode di belakang, tetapi tidak lebih dari "kasus khusus" yang mengikat. The ViewModel masih tidak memiliki pengetahuan tentang implementasi Lihat, yang menurut saya itu terjadi jika Anda mencoba untuk mengirimkan PasswordBox ke ViewModel.
Code Behind! = Pelanggaran MVVM otomatis. Itu semua tergantung pada apa yang Anda lakukan dengannya. Dalam hal ini, kami hanya secara manual mengkodekan suatu penjilidan, sehingga semuanya dianggap sebagai bagian dari implementasi UI dan oleh karena itu tidak masalah.
Di ViewModel, hanya properti sederhana. Saya membuatnya "menulis saja" karena seharusnya tidak perlu mengambilnya dari luar ViewModel dengan alasan apa pun, tetapi tidak harus begitu. Perhatikan bahwa ini adalah SecureString, bukan hanya string.
Di xaml, Anda mengatur pengendali event PasswordChanged.
Dalam kode di belakang:
Dengan metode ini, kata sandi Anda tetap dalam SecureString setiap saat dan karenanya memberikan keamanan maksimum. Jika Anda benar-benar tidak peduli dengan keamanan atau Anda memerlukan kata sandi teks yang jelas untuk metode hilir yang memerlukannya (catatan: sebagian besar. Metode NET yang memerlukan kata sandi juga mendukung opsi SecureString, sehingga Anda mungkin tidak benar-benar membutuhkan kata sandi teks yang jelas bahkan jika Anda merasa demikian), Anda dapat menggunakan properti Kata Sandi saja. Seperti ini:
(Properti ViewModel)
(Kode di belakang)
Jika Anda ingin agar semuanya tetap diketik dengan benar, Anda bisa mengganti pemain (dinamis) dengan antarmuka ViewModel Anda. Tapi sungguh, binding data "normal" juga tidak terlalu diketik, jadi itu bukan masalah besar.
Jadi yang terbaik dari semua dunia - kata sandi Anda aman, ViewModel Anda hanya memiliki properti seperti properti lainnya, dan Tampilan Anda mandiri tanpa memerlukan referensi eksternal.
sumber
Anda dapat menggunakan XAML ini:
Dan perintah ini menjalankan metode:
sumber
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=PasswordBox}}"
(catatan: tidakRelativeSource Self
).Ini bekerja dengan baik untuk saya.
sumber
ICommand
diimplementasikan dalam model tampilan, solusi ini akan melanggar pola MVVM.Solusi sederhana tanpa melanggar pola MVVM adalah dengan memperkenalkan acara (atau mendelegasikan) di ViewModel yang memanen kata sandi.
Dalam ViewModel :
public event EventHandler<HarvestPasswordEventArgs> HarvestPassword;
dengan EventArgs ini:
di View , berlangganan acara untuk membuat ViewModel dan isi nilai kata sandi.
Di ViewModel , saat Anda membutuhkan kata sandi, Anda dapat menjalankan acara dan mengambil kata sandi dari sana:
sumber
WeakEventManager<TEventSource, TEventArgs>
untuk menghindari kebocoran memori. Seringkali tampilan tidak memiliki masa pakai yang sama dengan model tampilan.WeakEventManager<IViewModel, EventArgs>.AddHandler(iViewModelInstance, nameof(IViewModel.Event), eventHandlerMethod);
Saya menghabiskan banyak waktu mencari berbagai solusi. Saya tidak suka ide dekorator, perilaku mengacaukan validasi UI, kode di belakang ... sungguh?
Yang terbaik adalah tetap berpegang pada properti terlampir kustom dan mengikat ke
SecureString
properti Anda dalam model tampilan Anda. Simpan di sana selama mungkin. Kapan pun Anda membutuhkan akses cepat ke kata sandi biasa, untuk sementara ubahlah ke string yang tidak aman menggunakan kode di bawah ini:Pastikan Anda mengizinkan GC untuk mengumpulkan elemen UI Anda, jadi tahan keinginan menggunakan pengendali acara statis untuk
PasswordChanged
acara diPasswordBox
. Saya juga menemukan anomali di mana kontrol tidak memperbarui UI ketika menggunakanSecurePassword
properti untuk menyiapkannya, alasan mengapa saya menyalin kata sandi ke dalamPassword
gantinya.Dan penggunaan XAML:
Properti saya dalam model tampilan tampak seperti ini:
Ini
RequiredSecureString
hanya validator khusus sederhana yang memiliki logika berikut:Ini dia. Solusi MVVM murni lengkap dan teruji.
sumber
Saya memasang GIST di sini yang merupakan kotak kata sandi yang dapat diikat.
sumber
ContentControl
Anda kemudian hanya dapat menggunakan PasswordBox sebagai konten dan gaya yang di XAML sesuai keinginan Anda. Tujuan dariContentControl
hanya untuk berlanggananPasswordChanged
acara dan mengekspos properti bindable dua arah. Secara keseluruhan, ini adalah 65 baris kode dan cukup banyak apa yang kelas dekorasi ini lakukan. Lihat di sini untuk intisari saya dari gist.github.com/leidegre/c7343b8c720000fe3132Implementasi ini sedikit berbeda. Anda meneruskan kotak kata sandi ke View melalui pengikatan properti di ViewModel, itu tidak menggunakan perintah params. The ViewModel Tetap Mengabaikan Tampilan. Saya memiliki Proyek VB vs 2010 yang dapat diunduh dari SkyDrive. Wpf MvvM PassWordBox Example.zip https://skydrive.live.com/redir.aspx?cid=e95997d33a9f8d73&resid=E95997D33A9F8D73!511
Cara Saya Menggunakan Kata Sandi dalam Aplikasi Wpf MvvM cukup sederhana dan berfungsi dengan baik untuk Saya. Itu tidak berarti bahwa saya pikir itu adalah cara yang benar atau cara terbaik. Ini hanyalah implementasi dari Menggunakan Kata Sandi dan Pola MvvM.
Pada dasarnya, Anda membuat properti hanya baca publik yang dapat diikat oleh View sebagai Contoh Kotak Kata Sandi (Kontrol aktual):
Saya menggunakan bidang dukungan hanya untuk melakukan Inisialisasi properti sendiri.
Kemudian Dari Xaml Anda mengikat Konten ContentControl atau Contoh Kontainer Kontrol:
Dari sana Anda memiliki kontrol penuh terhadap kotak kata sandi. Saya juga menggunakan PasswordAccessor (Just a Function of String) untuk mengembalikan Nilai Kata Sandi saat melakukan login atau apa pun yang Anda inginkan untuk kata sandi. Dalam Contoh saya memiliki properti publik dalam Model Objek Pengguna Generik. Contoh:
Di Objek Pengguna, properti string kata sandi hanya dapat dibaca tanpa dukungan toko apa pun, hanya mengembalikan Kata Sandi dari Kotak Kata Sandi. Contoh:
Kemudian di ViewModel saya memastikan Accessor dibuat dan diatur ke properti PasswordBox.Password 'Contoh:
Ketika saya membutuhkan kata sandi string untuk login saya hanya mendapatkan properti Kata Sandi Objek Pengguna yang benar-benar memanggil Fungsi untuk mengambil kata sandi dan mengembalikannya, maka kata sandi yang sebenarnya tidak disimpan oleh Objek Pengguna. Contoh: akan berada di ViewModel
Itu harus melakukannya. ViewModel tidak memerlukan pengetahuan tentang Kontrol Tampilan. View Just mengikat properti di ViewModel, tidak berbeda dengan View Binding ke Gambar atau Sumber Daya Lain. Dalam hal ini sumber daya (Properti) kebetulan menjadi kontrol pengguna. Ini memungkinkan untuk pengujian karena ViewModel menciptakan dan memiliki Properti dan Properti tidak tergantung pada View. Adapun Keamanan, saya tidak tahu seberapa baik implementasi ini. Tetapi dengan menggunakan Fungsi, Nilai tidak disimpan di Properti itu sendiri hanya diakses oleh Properti.
sumber
Untuk mengatasi masalah OP tanpa memecahkan MVVM, saya akan menggunakan konverter nilai kustom dan pembungkus untuk nilai (kata sandi) yang harus diambil dari kotak kata sandi.
Dalam model tampilan:
Karena model tampilan menggunakan
IWrappedParameter<T>
, tidak perlu memiliki pengetahuan tentangPasswordBoxWrapper
atau tidakPasswordBoxConverter
. Dengan cara ini Anda dapat mengisolasiPasswordBox
objek dari model tampilan dan tidak merusak pola MVVM.Dalam tampilan:
sumber
Meskipun saya setuju bahwa penting untuk menghindari menyimpan kata sandi di mana saja, saya masih memerlukan kemampuan untuk membuat Instantiate model tampilan tanpa tampilan dan menjalankan pengujian saya terhadapnya.
Solusi yang berhasil bagi saya adalah mendaftarkan fungsi PasswordBox.Password dengan model tampilan, dan meminta model tampilan memintanya ketika menjalankan kode login.
Ini tidak berarti baris kode di codebehind pandangan ini.
Jadi, di Login.xaml saya miliki
dan di Login.xaml.cs saya miliki
kemudian di LoginViewModel.cs saya telah mendefinisikan PasswordHandler
dan ketika masuk perlu terjadi kode memanggil pawang untuk mendapatkan kata sandi dari tampilan ...
Dengan cara ini, ketika saya ingin menguji model tampilan, saya cukup mengatur PasswordHandler ke metode anonim yang memungkinkan saya memberikan kata sandi apa pun yang ingin saya gunakan dalam pengujian.
sumber
Saya pikir saya akan melempar solusi saya, karena ini adalah masalah umum ... dan memiliki banyak pilihan selalu merupakan hal yang baik.
Aku hanya dibungkus
PasswordBox
dalamUserControl
dan menerapkanDependencyProperty
untuk dapat mengikat. Saya melakukan semua yang saya bisa untuk menghindari penyimpanan teks yang jelas dalam memori, jadi semuanya dilakukan melalui aSecureString
danPasswordBox.Password
properti. Selamaforeach
pengulangan, setiap karakter terpapar, tetapi sangat singkat. Jujur, jika Anda khawatir aplikasi WPF Anda akan dikompromikan dari paparan singkat ini, Anda punya masalah keamanan yang lebih besar yang harus ditangani.Keindahan dari ini adalah bahwa Anda tidak melanggar aturan MVVM, bahkan yang "purist", karena ini adalah
UserControl
, jadi diizinkan untuk memiliki kode-belakang. Saat Anda menggunakannya, Anda dapat memiliki komunikasi murni antaraView
danViewModel
tanpa AndaVideModel
sadari bagianView
atau sumber kata sandi. Pastikan Anda mengikatSecureString
diViewModel
.BindablePasswordBox.xaml
BindablePasswordBox.xaml.cs (Versi 1 - Tidak ada dukungan mengikat dua arah.)
Penggunaan Versi 1:
BindablePasswordBox.xaml.cs (Versi 2 - Memiliki dukungan pengikatan dua arah.)
Penggunaan Versi 2:
sumber
if (Password != secure)
akan selalu salah karena SecureString tidak menimpa sama dengan. Adakah pikiran?Anda dapat melakukannya dengan properti terlampir, lihat .. PasswordBox with MVVM
sumber
Saya menggunakan metode ini dan melewati kotak kata sandi, meskipun ini melanggar MVVM itu penting bagi saya karena saya menggunakan kontrol konten dengan templat data untuk login saya di dalam shell saya yang merupakan lingkungan shell yang kompleks. Jadi mengakses kode di balik shell pasti omong kosong.
Melewati kotak kata sandi yang menurut saya sama dengan mengakses kontrol dari kode di belakang sejauh yang saya tahu. Saya setuju kata sandi, jangan simpan di memori dll Dalam implementasi ini saya tidak memiliki properti untuk kata sandi dalam model tampilan.
Tombol perintah
ViewModel
sumber
Bagi saya, kedua hal ini terasa salah:
PasswordBox
parameter perintah ke ViewModelMentransfer SecurePassword (instance SecureString) seperti yang dijelaskan oleh Steve dalam CO tampaknya dapat diterima. saya lebih memilih
Behaviors
kode di belakang, dan saya juga memiliki persyaratan tambahan untuk dapat mengatur ulang kata sandi dari viewmodel.Xaml (
Password
adalah properti ViewModel):Tingkah laku:
sumber
Untuk pemula yang lengkap seperti saya, berikut adalah contoh kerja lengkap dari apa yang
Konamiman
disarankan di atas. Terima kasihKonamiman
.XAML
ViewModel
sumber
Ini adalah properti terlampir . Jenis properti ini dapat diterapkan untuk jenis apa pun
DependencyObject
, bukan hanya tipe yang dinyatakan. Jadi meskipun dideklarasikan diPasswordHelper
kelas statis, itu diterapkanPasswordBox
pada yang Anda gunakan.Untuk menggunakan properti terlampir ini, Anda hanya perlu mengikatnya ke
Password
properti di ViewModel Anda:sumber
Saya telah melakukan seperti:
XAML:
C #:
Ini bekerja untuk saya!
sumber
Seperti yang disebutkan sebelumnya, VM seharusnya tidak mengetahui tentang View tetapi melewatkan seluruh PasswordBox sepertinya pendekatan yang paling sederhana. Jadi mungkin alih-alih casting parameter yang diteruskan ke PasswordBox menggunakan Reflection untuk mengekstrak properti Password darinya. Dalam hal ini VM mengharapkan semacam Kontainer Kata Sandi dengan kata sandi properti (Saya menggunakan RelayCommands dari MVMM Light-Toolkit):
Itu dapat dengan mudah diuji dengan kelas anonim:
sumber
Di windows universal app
Anda dapat menggunakan kode ini dengan properti "Kata Sandi" dan mengikat dengan modelView
sumber
Bagi siapa pun yang mengetahui risiko penerapan ini, untuk memiliki sinkronisasi kata sandi ke ViewModel Anda cukup tambahkan Mode = OneWayToSource .
XAML
sumber
OneWayToSource
?Inilah pendapat saya:
Menggunakan properti terlampir untuk mengikat kata sandi mengalahkan tujuan mengamankan kata sandi. Properti Kata Sandi dari kotak kata sandi tidak dapat diikat karena suatu alasan.
Melewati kotak kata sandi sebagai parameter perintah akan membuat ViewModel mengetahui kontrolnya. Ini tidak akan berfungsi jika Anda berencana untuk membuat lintas platform ViewModel Anda dapat digunakan kembali. Jangan buat VM Anda tahu tentang View Anda atau kontrol lainnya.
Saya tidak berpikir memperkenalkan properti baru, antarmuka, berlangganan acara yang diubah kata sandi atau hal rumit lainnya diperlukan untuk tugas sederhana memberikan kata sandi.
XAML
Kode di belakang - menggunakan kode di belakang tidak selalu melanggar MVVM. Selama Anda tidak memasukkan logika bisnis di dalamnya.
ViewModel
sumber
Anda menemukan solusi untuk PasswordBox di aplikasi sampel ViewModel dari proyek WPF Application Framework (WAF) .
Namun, Justin benar. Jangan berikan kata sandi sebagai teks biasa antara View dan ViewModel. Gunakan SecureString sebagai gantinya (Lihat MSDN PasswordBox).
sumber
Saya menggunakan pemeriksaan otentikasi diikuti oleh sub yang dipanggil oleh kelas mediator ke View (yang juga mengimplementasikan pemeriksaan otentikasi) untuk menulis kata sandi ke kelas data.
Itu bukan solusi yang sempurna; Namun, itu memperbaiki masalah saya karena tidak bisa memindahkan kata sandi.
sumber
Saya menggunakan solusi ramah-MVVM ringkas yang belum disebutkan. Pertama, saya beri nama PasswordBox di XAML:
Lalu saya menambahkan pemanggilan metode tunggal ke dalam konstruktor tampilan:
Dan itu saja. Model tampilan akan menerima notifikasi ketika dilampirkan ke tampilan melalui DataContext dan notifikasi lain ketika dilepaskan. Isi pemberitahuan ini dapat dikonfigurasi melalui lambda, tetapi biasanya itu hanya setter atau metode panggilan pada model tampilan, melewati kontrol yang bermasalah sebagai parameter.
Itu dapat dibuat ramah-MVVM dengan sangat mudah dengan memiliki tampilan mengekspos antarmuka bukan kontrol anak.
Kode di atas bergantung pada kelas pembantu yang dipublikasikan di blog saya.
sumber
Saya menghabiskan waktu lama untuk mencoba ini bekerja. Pada akhirnya, saya menyerah dan hanya menggunakan PasswordBoxEdit dari DevExpress.
Ini adalah solusi paling sederhana yang pernah ada, karena memungkinkan pengikatan tanpa menarik trik yang mengerikan.
Solusi di situs web DevExpress
Sebagai catatan, saya tidak berafiliasi dengan DevExpress dengan cara apa pun.
sumber
;) mudah!
sumber
Sangat sederhana. Buat properti lain untuk kata sandi dan ikat ini dengan TextBox
Tetapi semua operasi input bekerja dengan properti kata sandi yang sebenarnya
private string _Password;
public string Password {get {return _Password; }
sumber
baik jawabanku lebih sederhana hanya untuk pola MVVM
di viewmodel kelas
properti kata sandi dari PasswordBox yang menang menyediakan atau WatermarkPasswordBox yang disediakan oleh XCeedtoolkit menghasilkan RoutedEventArgs sehingga Anda dapat mengikatnya.
sekarang dalam tampilan xmal
atau
sumber
Kirim
SecureString
ke model tampilan menggunakan Perilaku Terlampir danICommand
Tidak ada yang salah dengan kode-belakang ketika menerapkan MVVM. MVVM adalah pola arsitektur yang bertujuan untuk memisahkan pandangan dari model / logika bisnis. MVVM menjelaskan cara mencapai tujuan ini dengan cara yang dapat direproduksi (polanya). Itu tidak peduli tentang detail implementasi, seperti bagaimana Anda menyusun atau mengimplementasikan tampilan. Ini hanya menggambar batas-batas dan mendefinisikan apa pandangan, model tampilan dan apa model dalam hal terminologi pola ini.
MVVM tidak peduli dengan bahasa (XAML atau C #) atau kompiler (
partial
kelas). Kemandirian bahasa adalah karakteristik wajib dari pola desain - bahasa harus netral.Namun, kode-belakang memiliki beberapa kelemahan seperti membuat logika UI Anda lebih sulit untuk dipahami, ketika didistribusikan secara liar antara XAML dan C #. Tetapi yang paling penting mengimplementasikan logika atau objek UI seperti templat, gaya, pemicu, animasi dll dalam C # sangat kompleks dan jelek / kurang dapat dibaca daripada menggunakan XAML. XAML adalah bahasa markup yang menggunakan tag dan bersarang untuk memvisualisasikan hierarki objek. Membuat UI menggunakan XAML sangat mudah. Meskipun ada situasi di mana Anda baik-baik saja memilih untuk mengimplementasikan logika UI di C # (atau kode-belakang). Menangani
PasswordBox
adalah salah satu contohnya.Untuk alasan ini, menangani
PasswordBox
kode di belakang dengan menanganiPasswordBox.PasswordChanged
, bukan merupakan pelanggaran pola MVVM.Pelanggaran yang jelas adalah untuk melewatkan kontrol (the
PasswordBox
) ke model tampilan. Banyak solusi merekomendasikan hal ini, misalnya, melewati instance dariPasswordBox
asICommand.CommandParameter
untuk model tampilan. Jelas rekomendasi yang sangat buruk dan tidak perlu.Jika Anda tidak peduli tentang menggunakan C #, tetapi hanya ingin menjaga file di belakang kode Anda tetap bersih atau hanya ingin merangkum logika perilaku / UI, Anda selalu dapat menggunakan properti terlampir dan menerapkan perilaku terlampir.
Diseberang dari helper penyebaran luas terkenal yang memungkinkan pengikatan kata sandi teks biasa (anti-pola yang sangat buruk dan risiko keamanan), perilaku ini menggunakan a
ICommand
untuk mengirim kata sandiSecureString
pada model tampilan, kapan punPasswordBox
memunculkanPasswordBox.PasswordChanged
peristiwa.MainWindow.xaml
ViewModel.cs
PasswordBox.cs
sumber