Z wiązania z P Mam natknąć się na problem asswordBox
. Wygląda na to, że stanowi to zagrożenie bezpieczeństwa, ale używam wzorca MVVM, więc chcę to ominąć. Znalazłem tutaj interesujący kod (czy ktoś używał tego lub czegoś podobnego?)
http://www.wpftutorial.net/PasswordBox.html
Technicznie wygląda świetnie, ale nie jestem pewien, jak odzyskać hasło.
Zasadniczo mam właściwości w moim LoginViewModel
for Username
i Password
. Username
jest w porządku i działa tak jak jest TextBox
.
Użyłem powyższego kodu i podałem go
<PasswordBox ff:PasswordHelper.Attach="True"
ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
Kiedy miałem PasswordBox
jako a, TextBox
a Binding Path=Password
następnie właściwość LoginViewModel
została zaktualizowana.
Mój kod jest bardzo prosty, w zasadzie mam Command
dla siebie Button
. Kiedy naciskam, CanLogin
jest wywoływany, a jeśli zwraca true, wywołuje Login
.
Widzisz, sprawdzam tutaj swoją nieruchomość Username
, która działa świetnie.
W Login
wyślę razem z moim naprawiać Username
i Password
, Username
zawiera dane od mojego View
, ale Password
jestNull|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 { }
}
To właśnie robię
<TextBox Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}"
MinWidth="180" />
<PasswordBox ff:PasswordHelper.Attach="True"
ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
Mam TextBox
, to nie jest problem, ale w moim jest pusty.ViewModel
Password
Czy robię coś złego lub brakuje mi kroku?
Ustawiłem punkt przerwania i na pewno kod wchodzi do statycznej klasy pomocnika, ale nigdy nie aktualizuje mojego Password
w moim ViewModel
.
Odpowiedzi:
Przepraszam, ale robisz to źle.
Ludzie powinni mieć wytatuowane następujące wytyczne bezpieczeństwa na wewnętrznej stronie powiek:
Nigdy nie przechowuj haseł w postaci zwykłego tekstu w pamięci.
Powód, dla którego WPF / Silverlight
PasswordBox
nie ujawnia DP dlaPassword
właściwości, jest związany z bezpieczeństwem.Jeśli WPF / Silverlight
Password
miałby zachować DP , wymagałoby to od szkieletu, aby samo hasło nie było szyfrowane w pamięci. Co jest uważane za dość kłopotliwy wektor ataku bezpieczeństwa.PasswordBox
Zastosowania zaszyfrowane pamięci (swego rodzaju), a jedynym sposobem, aby uzyskać dostęp do hasła jest za pośrednictwem właściwości CLR.Sugerowałbym, aby podczas uzyskiwania dostępu do
PasswordBox.Password
właściwości CLR powstrzymywał się od umieszczania jej w dowolnej zmiennej lub jako wartości dla dowolnej właściwości.Przechowywanie hasła w postaci zwykłego tekstu w pamięci RAM komputera klienta jest zabezpieczeniem nie-nie.
Pozbądź się tego, że tam
public string Password { get; set; }
jesteś.Podczas uzyskiwania dostępu
PasswordBox.Password
po prostu wyjmij go i wyślij jak najszybciej na serwer. Nie trzymaj wartości hasła w pobliżu i nie traktuj go tak, jak każdego innego tekstu na komputerze klienta. Nie przechowuj haseł tekstowych w pamięci.Wiem, że to łamie wzorzec MVVM, ale nigdy nie powinieneś wiązać się z
PasswordBox.Password
Attached DP, przechowywać hasła w ViewModel lub innych podobnych shenaniganach.Jeśli szukasz rozwiązania o nadmiernej architekturze, oto jedno:
1. Utwórz
IHavePassword
interfejs za pomocą jednej metody, która zwraca czysty tekst hasła.2. mieć swój
UserControl
zaimplementowaćIHavePassword
interfejs.3. Zarejestruj
UserControl
instancję w swoim IoC jako implementującąIHavePassword
interfejs.4. Gdy ma miejsce żądanie serwera wymagające twojego hasła, zadzwoń do IoC w celu
IHavePassword
wdrożenia i tylko wtedy otrzymaj bardzo upragnione hasło.Tylko moje zdanie.
- Justin
źródło
Moje 2 centy:
Kiedyś opracowałem typowe okno dialogowe logowania (pola użytkownika i hasła oraz przycisk „Ok”) przy użyciu WPF i MVVM. Rozwiązałem problem wiązania hasła, przekazując samą kontrolę PasswordBox jako parametr do polecenia dołączonego do przycisku „Ok”. Więc w widoku miałem:
A w ViewModel
Execute
metoda dołączonego polecenia była następująca:To nieco narusza wzorzec MVVM, ponieważ teraz ViewModel wie coś o tym, jak widok jest implementowany, ale w tym konkretnym projekcie było mnie stać. Mam nadzieję, że jest to przydatne także dla kogoś.
źródło
Może czegoś mi brakuje, ale wygląda na to, że większość z tych rozwiązań komplikuje sprawy i eliminuje bezpieczne praktyki.
Ta metoda nie narusza wzorca MVVM i zapewnia pełne bezpieczeństwo. Tak, technicznie rzecz biorąc, jest w tyle za kodem, ale nie jest niczym więcej niż powiązaniem „specjalnego przypadku”. ViewModel nadal nie ma wiedzy na temat implementacji View, co moim zdaniem ma, jeśli próbujesz przekazać PasswordBox do ViewModel.
Code Behind! = Automatyczne naruszenie MVVM. Wszystko zależy od tego, co z tym zrobisz. W tym przypadku po prostu ręcznie kodujemy powiązanie, więc jest ono uważane za część implementacji interfejsu użytkownika i dlatego jest w porządku.
W ViewModel, tylko prosta właściwość. Zrobiłem to „tylko do pisania”, ponieważ nie powinno być potrzeby pobierania go spoza ViewModel z jakiegokolwiek powodu, ale nie musi tak być. Pamiętaj, że jest to SecureString, a nie tylko ciąg znaków.
W xaml konfigurujesz moduł obsługi zdarzeń PasswordChanged.
W kodzie za:
Dzięki tej metodzie Twoje hasło pozostaje w SecureString przez cały czas, a zatem zapewnia maksymalne bezpieczeństwo. Jeśli naprawdę nie zależy ci na bezpieczeństwie lub potrzebujesz hasła w postaci jawnego tekstu dla wymagającej go metody (uwaga: większość metod .NET wymagających hasła obsługuje także opcję SecureString, więc może nie być tak naprawdę hasła nawet jeśli uważasz, że tak), zamiast tego możesz po prostu użyć właściwości Hasło. Lubię to:
(Właściwość ViewModel)
(Kod za)
Jeśli chcesz zachować silną charakterystykę, możesz zastąpić (dynamiczną) obsadę interfejsem swojego ViewModel. Ale tak naprawdę „normalne” powiązania danych również nie są silnie typowane, więc nie jest to nic wielkiego.
Więc najlepiej ze wszystkich światów - twoje hasło jest bezpieczne, twój ViewModel ma po prostu właściwość jak każda inna właściwość, a Twój widok jest samowystarczalny i nie wymaga żadnych zewnętrznych odniesień.
źródło
Możesz użyć tego XAML:
I to polecenie wykonuje metodę:
źródło
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=PasswordBox}}"
(uwaga: nieRelativeSource Self
).To działa dobrze dla mnie.
źródło
ICommand
jest on zaimplementowany w modelu widoku, to rozwiązanie naruszałoby wzorzec MVVM.Prostym rozwiązaniem bez naruszenia wzorca MVVM jest wprowadzenie zdarzenia (lub delegowania) w ViewModel, które zbiera hasło.
W ViewModel :
public event EventHandler<HarvestPasswordEventArgs> HarvestPassword;
z tymi EventArgs:
w Widoku zasubskrybuj wydarzenie podczas tworzenia ViewModel i wpisz wartość hasła.
Gdy potrzebujesz hasła, w ViewModel możesz uruchomić zdarzenie i stamtąd pobrać hasło:
źródło
WeakEventManager<TEventSource, TEventArgs>
aby uniknąć wycieków pamięci. Często widok nie będzie miał takiego samego okresu życia jak model viewmodel.WeakEventManager<IViewModel, EventArgs>.AddHandler(iViewModelInstance, nameof(IViewModel.Event), eventHandlerMethod);
Spędziłem dużo czasu, szukając różnych rozwiązań. Nie podobał mi się pomysł dekoratorów, zachowania popsuły interfejs sprawdzania poprawności, kod za ... naprawdę?
Najlepszym z nich jest trzymanie się niestandardowej, dołączonej właściwości i wiązanie się z twoją
SecureString
właściwością w modelu widoku. Trzymaj go tam tak długo, jak możesz. Ilekroć będziesz potrzebować szybkiego dostępu do zwykłego hasła, tymczasowo przekonwertuj je na niezabezpieczony ciąg, używając poniższego kodu:Upewnij się, że zezwalasz GC na gromadzenie elementu interfejsu użytkownika, więc oprzyj się potrzebie użycia statycznego modułu obsługi zdarzeń dla
PasswordChanged
zdarzenia w sieciPasswordBox
. Odkryłem również anomalię, w której formant nie aktualizował interfejsu użytkownika podczas korzystania zSecurePassword
właściwości do jego konfigurowania, dlategoPassword
zamiast tego kopiuję hasło .A użycie XAML:
Moja właściwość w modelu widoku wyglądała następująco:
Jest
RequiredSecureString
to prosty niestandardowy moduł sprawdzania poprawności, który ma następującą logikę:Masz to. Kompletne i przetestowane czyste rozwiązanie MVVM.
źródło
Zamieściłem tutaj GIST , która jest wiążącym polem hasła.
źródło
ContentControl
, możesz użyć PasswordBox jako zawartości i stylu, który pasuje do XAML. Celem tegoContentControl
jest po prostu zasubskrybowaniePasswordChanged
wydarzenia i ujawnienie dwukierunkowej wiążącej właściwości. Podsumowując, jest to 65 linii kodu i właściwie to, co robi ta klasa dekoracji. Zobacz tutaj mój sedno następującego gist.github.com/leidegre/c7343b8c720000fe3132Ta implementacja jest nieco inna. Przekazujesz hasło do powiązania View przez właściwość w ViewModel, nie używa on żadnych parametrów poleceń. ViewModel pozostaje ignorantem widoku. Mam projekt VB vs 2010, który można pobrać z SkyDrive. Wpf MvvM PassWordBox Example.zip https://skydrive.live.com/redir.aspx?cid=e95997d33a9f8d73&resid=E95997D33A9F8D73!511
Sposób, w jaki używam PasswordBox w aplikacji Wpf MvvM jest dość uproszczony i działa dobrze dla mnie. Nie oznacza to, że uważam, że jest to właściwy lub najlepszy sposób. To tylko implementacja Korzystanie z PasswordBox i Wzorca MvvM.
Zasadniczo tworzysz publiczną właściwość tylko do odczytu, z którą widok może się połączyć jako PasswordBox (rzeczywista kontrola) Przykład:
Korzystam z pola kopii zapasowej tylko w celu samodzielnego zainicjowania właściwości.
Następnie z Xaml wiążesz zawartość ContentControl lub Control Container Przykład:
Stamtąd masz pełną kontrolę nad hasłem. Używam również PasswordAccessor (po prostu funkcja ciągu), aby zwrócić wartość hasła podczas logowania lub cokolwiek innego, dla czego chcesz hasło. W tym przykładzie mam właściwość publiczną w ogólnym modelu obiektowym użytkownika. Przykład:
W obiekcie użytkownika właściwość ciągu hasła jest odczytywana tylko bez magazynu kopii zapasowych, po prostu zwraca hasło z PasswordBox. Przykład:
Następnie w ViewModel upewniam się, że Accessor został utworzony i ustawiony na właściwość PasswordBox.Password 'Przykład:
Kiedy potrzebuję ciągu Hasło powiedzieć do logowania, po prostu otrzymuję właściwość Hasło obiektów użytkownika, która naprawdę wywołuje funkcję, aby pobrać hasło i zwrócić je, a następnie rzeczywiste hasło nie jest przechowywane przez obiekt użytkownika. Przykład: byłby w ViewModel
Że należy to zrobić. ViewModel nie potrzebuje żadnej wiedzy o kontrolkach View. Widok po prostu wiąże się z właściwością w ViewModel, nie różni się niczym od widoku Powiązanie z obrazem lub innym zasobem. W tym przypadku ten zasób (Właściwość) jest po prostu kontrolą użytkownika. Umożliwia testowanie, ponieważ ViewModel tworzy właściwość i jest jej właścicielem, a właściwość jest niezależna od widoku. Jeśli chodzi o bezpieczeństwo, nie wiem, jak dobra jest ta implementacja. Ale za pomocą funkcji wartość nie jest przechowywana w samej właściwości, do której właściwość ma dostęp.
źródło
Aby rozwiązać problem OP bez zerwania MVVM, użyłbym niestandardowego konwertera wartości i opakowania wartości (hasła), które należy pobrać z pola hasła.
W modelu widoku:
Ponieważ używa modelu widoku
IWrappedParameter<T>
, nie musi on posiadać żadnej wiedzy na tematPasswordBoxWrapper
aniPasswordBoxConverter
. W ten sposób możesz odizolowaćPasswordBox
obiekt od modelu widoku i nie przerywać wzorca MVVM.W widoku:
źródło
Chociaż zgadzam się, że ważne jest, aby unikać przechowywania hasła w dowolnym miejscu, nadal potrzebuję możliwości tworzenia modelu widoku bez widoku i wykonywania na nim testów.
Rozwiązaniem, które działało dla mnie, było zarejestrowanie funkcji PasswordBox.Password w modelu widoku i wywołanie jej przez model widoku podczas wykonywania kodu logowania.
To nie znaczy, linię kodu w kodzie widoku za.
Tak więc w moim Login.xaml mam
i w Login.xaml.cs mam
następnie w LoginViewModel.cs mam zdefiniowane PasswordHandler
a kiedy trzeba się zalogować, kod wywołuje moduł obsługi, aby uzyskać hasło z widoku ...
W ten sposób, gdy chcę przetestować model widoku, mogę po prostu ustawić PasswordHandler na anonimową metodę, która pozwala mi podać dowolne hasło, którego chcę użyć w teście.
źródło
Pomyślałem, że wrzucę swoje rozwiązanie do miksu, ponieważ jest to tak powszechny problem ... a posiadanie wielu opcji jest zawsze dobrą rzeczą.
Ja po prostu zapakowane
PasswordBox
w sposóbUserControl
i wdrożyłDependencyProperty
aby móc związać. Robię wszystko, co w mojej mocy, aby uniknąć zapisywania wyraźnego tekstu w pamięci, więc wszystko odbywa się za pomocą aSecureString
iPasswordBox.Password
własności. Podczasforeach
pętli każda postać zostaje odsłonięta, ale jest bardzo krótka. Szczerze mówiąc, jeśli martwisz się, że twoja aplikacja WPF zostanie naruszona w wyniku tego krótkiego ujawnienia, masz większe problemy z bezpieczeństwem, które należy rozwiązać.Piękno tego polega na tym, że nie łamiesz żadnych zasad MVVM, nawet tych „purystycznych”, ponieważ jest to
UserControl
tak, że można mieć w tyle kod. Kiedy go używasz, możesz mieć czystą komunikację pomiędzyView
iViewModel
bezVideModel
świadomości jakiejkolwiek częściView
lub źródła hasła. Wystarczy upewnić się, że wiązanie sięSecureString
w twojejViewModel
.BindablePasswordBox.xaml
BindablePasswordBox.xaml.cs (Wersja 1 - Brak obsługi wiązania dwukierunkowego).
Zastosowanie wersji 1:
BindablePasswordBox.xaml.cs (Wersja 2 - Obsługuje dwukierunkowe wiązanie).
Zastosowanie wersji 2:
źródło
if (Password != secure)
zawsze będzie fałszem, ponieważ SecureString nie zastępuje równości. jakieś pomysły?możesz to zrobić z dołączoną właściwością, zobacz. PasswordBox z MVVM
źródło
Użyłem tej metody i przekazałem pole hasła, chociaż narusza to MVVM, było to dla mnie bardzo ważne, ponieważ użyłem formantu zawartości z szablonem danych do logowania w mojej powłoce, co jest złożonym środowiskiem powłoki. Więc dostęp do kodu za powłoką byłby bzdurą.
Przekazywanie skrzynki hasła, jak sądzę, jest tak samo jak uzyskiwanie dostępu do kodu z tyłu, o ile wiem. Zgadzam się z hasłami, nie przechowuj w pamięci itp. W tej implementacji nie mam właściwości hasła w widoku modelu.
Polecenie przycisku
ViewModel
źródło
Dla mnie obie te rzeczy są złe:
PasswordBox
jako parametru polecenia do ViewModelPrzeniesienie SecurePassword (instancja SecureString) zgodnie z opisem Steve'a w CO wydaje się dopuszczalne. Wolę
Behaviors
kodować z tyłu, a także miałem dodatkowy wymóg resetowania hasła z viewmodelu.Xaml (
Password
jest właściwością ViewModel):Zachowanie:
źródło
Dla kompletnych początkujących, takich jak ja, tutaj jest kompletna działająca próbka tego, co
Konamiman
sugerowano powyżej. DziękiKonamiman
.XAML
ViewModel
źródło
Jest to nieruchomość przyłączona . Tego rodzaju właściwość można zastosować do dowolnego rodzaju
DependencyObject
, nie tylko typu, w którym jest zadeklarowana. Więc chociaż jest zadeklarowany wPasswordHelper
klasie statycznej, jest stosowany doPasswordBox
na którym go używasz.Aby użyć tej dołączonej właściwości, wystarczy powiązać ją z
Password
właściwością w swoim ViewModel:źródło
Zrobiłem jak:
XAML:
DO#:
Mi to pasuje!
źródło
Jak wspomniano wcześniej, VM nie powinna wiedzieć o widoku, ale przekazanie całego PasswordBox wygląda na najprostsze podejście. Może więc zamiast rzutować parametr na PasswordBox użyj Reflection, aby wyodrębnić z niego właściwość Password. W tym przypadku VM oczekuje pewnego rodzaju kontenera haseł z właściwością Hasło (używam RelayCommands z MVMM Light-Toolkit):
Można go łatwo przetestować za pomocą anonimowej klasy:
źródło
W Windows Universal App
możesz użyć tego kodu z właściwością „Hasło” i powiązaniem z modelView
źródło
Dla każdego, kto zdaje sobie sprawę z zagrożeń, jakie nakłada ta implementacja, aby zsynchronizować hasło z ViewModel, po prostu dodaj Mode = OneWayToSource .
XAML
źródło
OneWayToSource
?Oto moje zdanie na ten temat:
Użycie dołączonej właściwości do powiązania hasła nie pozwala na zabezpieczenie hasła. Właściwość Hasło pola hasła nie może zostać powiązana z jakiegoś powodu.
Przekazanie pola hasła jako parametru polecenia uświadomi ViewModel kontrolę. To nie zadziała, jeśli planujesz, aby Twoja platforma ViewModel była wielokrotnego użytku. Nie informuj maszyny wirtualnej o swoim widoku ani żadnych innych kontrolkach.
Nie sądzę, aby wprowadzenie nowej właściwości, interfejsu, subskrybowanie zdarzeń zmieniających hasło lub innych skomplikowanych rzeczy było konieczne do wykonania prostego zadania podania hasła.
XAML
Kod z tyłu - użycie kodu z tyłu niekoniecznie narusza MVVM. Dopóki nie wprowadzisz w to żadnej logiki biznesowej.
ViewModel
źródło
Rozwiązanie dla PasswordBox znajduje się w przykładowej aplikacji ViewModel w WPF Application Framework (WAF) .
Jednak Justin ma rację. Nie podawaj hasła jako zwykłego tekstu między View a ViewModel. Zamiast tego użyj SecureString (zobacz MSDN PasswordBox).
źródło
Użyłem sprawdzania uwierzytelnienia, a następnie podrzędnego wywołanego przez klasę mediatora do widoku (który również implementuje sprawdzenie uwierzytelnienia), aby zapisać hasło do klasy danych.
To nie jest idealne rozwiązanie; rozwiązało to jednak mój problem braku możliwości przeniesienia hasła.
źródło
Używam zwięzłego, przyjaznego dla MVVM rozwiązania, o którym jeszcze nie wspomniano. Najpierw nazywam PasswordBox w XAML:
Następnie dodaję jedno wywołanie metody do konstruktora widoku:
I to wszystko. Wyświetl model otrzyma powiadomienie, gdy zostanie dołączone do widoku za pośrednictwem DataContext, a kolejne powiadomienie, gdy zostanie odłączone. Treść tego powiadomienia można konfigurować za pomocą lambdas, ale zwykle jest to po prostu setter lub wywołanie metody w modelu widoku, przekazując problematyczne sterowanie jako parametr.
Można bardzo łatwo uczynić go przyjaznym dla MVVM dzięki interfejsowi wyświetlania zamiast kontroli potomnej.
Powyższy kod opiera się na klasie pomocniczej opublikowanej na moim blogu.
źródło
Spędziłem wieki próbując sprawić, by to zadziałało. W końcu zrezygnowałem i po prostu użyłem PasswordBoxEdit z DevExpress.
Jest to najprostsze rozwiązanie w historii, ponieważ pozwala na wiązanie bez wykonywania okropnych sztuczek.
Rozwiązanie na stronie DevExpress
Dla przypomnienia, nie jestem w żaden sposób związany z DevExpress.
źródło
;) łatwo!
źródło
To jest bardzo proste . Utwórz kolejną właściwość hasła i powiąż ją za pomocą TextBox
Ale wszystkie operacje wprowadzania są wykonywane z rzeczywistą właściwością hasła
prywatny ciąg _Password;
ciąg publiczny Hasło {get {return _Password; }
źródło
cóż, moja odpowiedź jest prostsza tylko dla wzoru MVVM
w klasie viewmodel
właściwość password funkcji PasswordBox, która wygrywa, lub WatermarkPasswordBox, którą zapewnia XCeedtoolkit, generuje RoutedEventArgs, dzięki czemu można ją powiązać.
teraz w widoku Xmal
lub
źródło
Wyślij
SecureString
do modelu widoku za pomocą Attached Behavior iICommand
W implementacji MVVM nie ma nic złego w kodowaniu. MVVM to wzorzec architektoniczny, którego celem jest oddzielenie widoku od modelu / logiki biznesowej. MVVM opisuje, jak osiągnąć ten cel w powtarzalny sposób (wzorzec). Nie dbają o szczegóły implementacji, takie jak struktura lub implementacja widoku. Po prostu wyznacza granice i określa, co to jest widok, model widoku i co model pod względem terminologii tego wzorca.
MVVM nie dba o język (XAML lub C #) ani kompilator (
partial
klasy). Niezależność językowa jest obowiązkową cechą wzoru - musi być neutralna językowo.Jednak kodowanie ma pewne wady, takie jak utrudnienie zrozumienia logiki interfejsu użytkownika, gdy jest ona rozproszona między XAML i C #. Ale najważniejsze implementowanie logiki interfejsu użytkownika lub obiektów, takich jak szablony, style, wyzwalacze, animacje itp. W języku C # jest bardzo złożone i brzydkie / mniej czytelne niż przy użyciu XAML. XAML to język znaczników, który wykorzystuje tagi i zagnieżdżanie do wizualizacji hierarchii obiektów. Tworzenie interfejsu użytkownika za pomocą XAML jest bardzo wygodne. Chociaż są sytuacje, w których dobrze jest wybrać logikę interfejsu użytkownika w języku C # (lub z tyłu kodu). Obsługa
PasswordBox
jest jednym z przykładów.Z tego powodu obsługa
PasswordBox
kodu z tyłu za pomocąPasswordBox.PasswordChanged
, nie stanowi naruszenia wzorca MVVM.Oczywistym naruszeniem byłoby przekazanie kontrolki (the
PasswordBox
) do modelu widoku. Wiele rozwiązań poleca to np. Zatoka przechodząc przez instancjęPasswordBox
asICommand.CommandParameter
do modelu widoku. Oczywiście bardzo zła i niepotrzebna rekomendacja.Jeśli nie obchodzi Cię używanie C #, ale po prostu chcesz utrzymać plik za kodem w czystości lub po prostu chcesz zawrzeć logikę zachowania / interfejsu użytkownika, zawsze możesz skorzystać z dołączonych właściwości i zaimplementować załączone zachowanie.
W przeciwieństwie do niesławnego pomocnika o szerokim zasięgu, który umożliwia powiązanie z hasłem zwykłego tekstu (naprawdę złe anty-wzorzec i ryzyko bezpieczeństwa), to zachowanie używa
ICommand
do wysyłania hasłaSecureString
do modelu widoku, ilekroćPasswordBox
podnosi toPasswordBox.PasswordChanged
zdarzenie.MainWindow.xaml
ViewModel.cs
PasswordBox.cs
źródło