最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF PasswordBox進行數(shù)據(jù)綁定方法

 更新時間:2021年06月24日 11:00:25   作者:louzi  
有的時候會遇見PasswordBox的Password屬性不是依賴屬性,因此無法進行數(shù)據(jù)綁定。本文介紹如何通過添加附加屬性解決該問題,有此問題的同學(xué)可以參考下本文

本文介紹下PasswordBox進行數(shù)據(jù)綁定的方法,本文參考鏈接

本文完整示例程序見GitHub。

問題描述

PasswordBox的Password屬性不是依賴屬性,因此無法進行數(shù)據(jù)綁定。

解決辦法

該問題的解決辦法有多種,本文介紹如何通過添加附加屬性解決該問題。

附加屬性是說一個屬性本不屬于某個對象,但由于某種需求附加到該對象上,通過附加屬性可以實現(xiàn)將屬性與宿主解耦的目的。附加屬性本質(zhì)上就是依賴屬性,只是它們在屬性包裝器和注冊時有區(qū)別。注冊附加屬性使用RegisterAttached方法,注冊依賴屬性使用Register方法,這兩個方法的參數(shù)差別并不大。

首先添加一個PasswordBoxBindingHelper類,該類包含一個附加屬性(snippet:propa+兩次tab),通過設(shè)置該屬性的PropertyChangedCallback將改變通知到PasswordBox.Password,并通過添加對PasswordBox.PasswordChanged事件的響應(yīng)來響應(yīng)PasswordBox.Password的改變。有了該附加屬性,即可進行數(shù)據(jù)綁定。

public static string GetPasswordContent(DependencyObject obj) => (string)obj.GetValue(PasswordContentProperty);

public static void SetPasswordContent(DependencyObject obj, string value) => obj.SetValue(PasswordContentProperty, value);

public static readonly DependencyProperty PasswordContentProperty =
    DependencyProperty.RegisterAttached("PasswordContent", typeof(string), typeof(PasswordBoxBindingHelper),
    new PropertyMetadata(string.Empty, OnPasswordContentPropertyChanged));

private static void OnPasswordContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var box = d as PasswordBox;
    box.PasswordChanged -= OnPasswordChanged;
    var password = (string)e.NewValue;
    if (box != null && box.Password != password)
        box.Password = password;
    box.PasswordChanged += OnPasswordChanged;
}

private static void OnPasswordChanged(object sender, RoutedEventArgs e)
{
    var box = sender as PasswordBox;
    SetPasswordContent(box, box.Password);
}

然后在View中使用該附加屬性進行數(shù)據(jù)綁定,本文示例中主窗口包含一個PasswordBox控件及一個Button按鈕:

// xaml 綁定附加屬性
<Window ...
        xmlns:local="clr-namespace:PasswordBoxBinding"
        Title="PasswordBoxBinding" Height="300" Width="450" WindowStartupLocation="CenterScreen">

    <Grid>
        <StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
            <PasswordBox MinWidth="200" Height="30" BorderBrush="LightGray" BorderThickness="2"
                         local:PasswordBoxBindingHelper.PasswordContent="{Binding Password,Mode=TwoWay}"/>
            <Rectangle Width="20"/>
            <Button Width="80" Height="30" Content="查看密碼" Command="{Binding ClickedCommand}"/>
        </StackPanel>
    </Grid>
</Window>

//xaml.cs 設(shè)置綁定源
public MainWindow()
{
    InitializeComponent();
    this.DataContext = new MainWindowViewModel();
}

最后創(chuàng)建ViewModel進行邏輯處理:

// ViewModel
public class MainWindowViewModel : INotifyPropertyChanged
{
    public string Password
    {
        get => _password;
        set
        {
            _password = value;
            OnPropertyChanged();
        }
    }

    public DelegateCommand ClickedCommand => _clickedCommand ?? (_clickedCommand = new DelegateCommand { ExecuteAction = OnClicked });

    // 使用CallerMemberName特性簡化代碼,并可以避免手動輸入錯誤
    public void OnPropertyChanged([CallerMemberName] string name = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

    private void OnClicked(object o) => MessageBox.Show($"password: {Password}");

    public event PropertyChangedEventHandler PropertyChanged;

    private DelegateCommand _clickedCommand;
    private string _password;
}

// 實現(xiàn)ICommand
public class DelegateCommand : ICommand
{
    public bool CanExecute(object parameter) => CanExecuteAction?.Invoke(parameter) ?? true;

    public void Execute(object parameter) => ExecuteAction?.Invoke(parameter);

    public event EventHandler CanExecuteChanged;

    public Action<object> ExecuteAction { get; set; }
    public Func<object, bool> CanExecuteAction { get; set; }
}

以上就是WPF PasswordBox進行數(shù)據(jù)綁定方法的詳細內(nèi)容,更多關(guān)于WPF PasswordBox數(shù)據(jù)綁定的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • HttpWebRequest出錯.Section=ResponseHeader Detail=CR

    HttpWebRequest出錯.Section=ResponseHeader Detail=CR

    HttpWebRequest出錯.Section=ResponseHeader Detail=CR...
    2007-03-03
  • Winform消除button按下出現(xiàn)的虛線簡單實現(xiàn)方法

    Winform消除button按下出現(xiàn)的虛線簡單實現(xiàn)方法

    這篇文章主要介紹了Winform消除button按下出現(xiàn)的虛線簡單實現(xiàn)方法,通過重寫button設(shè)置Selectable參數(shù)實現(xiàn)該功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 使用C#實現(xiàn)對任意區(qū)域任意大小的截圖

    使用C#實現(xiàn)對任意區(qū)域任意大小的截圖

    這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)簡單的截圖功能,可以對任意區(qū)域任意大小的截圖,感興趣的小伙伴可以跟隨小編一起學(xué)習一下
    2024-01-01
  • C#中的IDisposable模式用法詳解

    C#中的IDisposable模式用法詳解

    這篇文章主要介紹了C#中的IDisposable模式用法,講述了垃圾資源回收機制的實現(xiàn),并對比分析了Dispose()方法、~DisposableClass()析構(gòu)函數(shù)、虛方法Dispose(bool disposing)的原理,需要的朋友可以參考下
    2014-09-09
  • 舉例講解C#編程中委托的實例化使用

    舉例講解C#編程中委托的實例化使用

    這篇文章主要介紹了C#編程中委托的實例化使用,包括委托的聲明和多播委托的創(chuàng)建等內(nèi)容,需要的朋友可以參考下
    2016-01-01
  • C#?List生成Txt文檔并且讀取Txt文檔封裝List

    C#?List生成Txt文檔并且讀取Txt文檔封裝List

    這篇文章主要介紹了C#?List生成Txt文檔并且讀取Txt文檔封裝List,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • C#中的out關(guān)鍵字用法詳解

    C#中的out關(guān)鍵字用法詳解

    在 C# 中,out 關(guān)鍵字是一個修飾符,它允許你在方法內(nèi)部創(chuàng)建一個臨時的變量,用于接收傳遞進來的參數(shù)值,并在方法執(zhí)行完畢后,將該變量的值返回給調(diào)用方法的對象,本文將給大家詳細介紹一下C#中的out關(guān)鍵字用法,需要的朋友可以參考下
    2024-02-02
  • C#自定義字符串壓縮和解壓縮的方法

    C#自定義字符串壓縮和解壓縮的方法

    這篇文章主要介紹了C#自定義字符串壓縮和解壓縮的方法,通過自定義C#字符串操作類實現(xiàn)對字符串的壓縮與解壓的功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#編寫Windows服務(wù)實例代碼

    C#編寫Windows服務(wù)實例代碼

    本篇文章主要介紹使用Microsoft Visual Studio2012可以很方便的創(chuàng)建一個Windows服務(wù),本例實現(xiàn)一個向D盤的txt文件里,寫入系統(tǒng)時間的Windows服務(wù)
    2013-10-10
  • c#實現(xiàn)攝像頭拍照功能示例

    c#實現(xiàn)攝像頭拍照功能示例

    這篇文章主要介紹了c#實現(xiàn)攝像頭拍照功能示例,需要的朋友可以參考下
    2014-04-04

最新評論

新宁县| 油尖旺区| 岑巩县| 玛沁县| 丰城市| 黑水县| 丰城市| 当涂县| 巧家县| 新田县| 姚安县| 宁海县| 射洪县| 赤峰市| 海丰县| 即墨市| 鹤庆县| 西盟| 长岛县| 靖远县| 两当县| 北流市| 嵊州市| 平邑县| 香港 | 阜阳市| 平罗县| 房产| 阿勒泰市| 怀宁县| 邮箱| 湟中县| 宜宾县| 井冈山市| 蓬莱市| 辉南县| 忻州市| 泸州市| 若尔盖县| 西丰县| 深水埗区|