国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WPF 用戶控件依賴注入賦值

這篇具有很好參考價(jià)值的文章主要介紹了WPF 用戶控件依賴注入賦值。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

我一直想組件化得去開(kāi)發(fā)WPF,因?yàn)槲矣X(jué)得將復(fù)雜問(wèn)題簡(jiǎn)單化是最好的

如何組件化開(kāi)發(fā)

WPF 用戶控件依賴注入賦值,WPF 入門知識(shí),wpf

主窗口引用

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:MD="http://materialdesigninxaml.net/winfx/xaml/themes"
        xmlns:Views="clr-namespace:WpfApp1.Views"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" >
    <Window.Resources>
        <Style x:Key="my_text" TargetType="TextBlock">
            <Setter Property="FontSize" Value="30" />
            <Setter Property="Margin" Value="8" />
        </Style>
    </Window.Resources>
    <Window.DataContext >
        <!--需要命名來(lái)指定數(shù)據(jù)源-->
        <local:MainWindowViewModel x:Name="viewModel"/>
    </Window.DataContext>
    <Grid>
        <!--不能直接寫TitleValue,Binding數(shù)據(jù)源會(huì)有問(wèn)題-->
        <Views:ViewA Margin="10"
                Title="{Binding ElementName=viewModel,Path=TitleValue}" />
    </Grid>
</Window>

cs部分

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class MainWindowViewModel
    {
        public string TitleValue { get; set; } =  "我是測(cè)試數(shù)據(jù)";

    }
}

控件窗口

    <UserControl.DataContext>
        <local:ViewAViewModel />
    </UserControl.DataContext>

    <Grid>
        <TextBlock Text="{Binding Title}" />
    </Grid>
/// <summary>
/// ViewA.xaml 的交互邏輯
/// </summary>
public partial class ViewA : UserControl
{

    public static readonly DependencyProperty TitleProperty;

    /// <summary>
    /// 為了拿到數(shù)據(jù)源需要定義一下
    /// </summary>
    private ViewAViewModel ViewModel = new ViewAViewModel();
    public ViewA()
    {
        InitializeComponent();
        ViewModel = (ViewAViewModel)DataContext;

    }
    static ViewA()
    {
        //靜態(tài)構(gòu)造
        TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(ViewA),new PropertyMetadata("",
            new PropertyChangedCallback((item, res) =>
            {
                //拿到數(shù)據(jù),再次賦值
                var model =(ViewA)item;
                model.ViewModel.Title = (string)res.NewValue;
            })));
    }

    /// <summary>
    /// 只是為了有代碼提示,添加依賴屬性后不會(huì)被調(diào)用
    /// </summary>

    public string Title { get; set; }




}
public partial class ViewAViewModel : ObservableObject
{
    /// <summary>
    /// 通知更新
    /// </summary>
    [ObservableProperty]
    private string title = "ViewA Title!";

}

依賴注入代碼優(yōu)化

我將復(fù)雜的依賴注入的代碼進(jìn)行了優(yōu)化,減少了重復(fù)內(nèi)容的輸入。

//原代碼
TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(ViewA), new PropertyMetadata(default,
  new PropertyChangedCallback((item, res) =>
  {
      //拿到數(shù)據(jù),再次賦值
      var model = (ViewA)item;
      model.ViewModel.Title = (string)res.NewValue;
  })));

//新代碼

 TitleProperty = DependencyPropertySet<ViewA, string>("Title", (view, value) =>
 {
     view.ViewModel.Title = value;
 });


/// <summary>
/// 簡(jiǎn)化依賴注入代碼
/// </summary>
/// <typeparam name="View"></typeparam>
/// <typeparam name="Value"></typeparam>
/// <param name="name"></param>
/// <param name="action"></param>
/// <returns></returns>
public static DependencyProperty DependencyPropertySet<View,Value>(string name,Action<View,Value> action) 
    where View : class 
{
    var res=  DependencyProperty.Register(name, typeof(Value), typeof(View), new PropertyMetadata(default,
        new PropertyChangedCallback((item, res) =>
        {
            var model = item as View;
            var value = (Value)res.NewValue;
            if(model != null)
            {
                action(model, value);
            }else
               {
                   throw new Exception("model value is null");
               }
        })));
    return res;
}



更新2023年12月9日

我現(xiàn)在依賴屬性擴(kuò)展封裝在一個(gè)靜態(tài)文件里面

namespace BlankApp1.Utils
{
    public class MyWpfExtension<View> where View : class
    {
        
        
        /// <summary>
        /// 簡(jiǎn)化依賴注入代碼
        /// </summary>
        /// <typeparam name="View"></typeparam>
        /// <typeparam name="Value"></typeparam>
        /// <param name="name"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public DependencyProperty DependencyPropertySet<Value>(string name, Action<View, Value> action)
        {
            var res = DependencyProperty.Register(name, typeof(Value), typeof(View), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                new PropertyChangedCallback((item, res) =>
                {
                    var model = item as View;
                    var value = (Value)res.NewValue;
                    if (model != null)
                    {
                        action(model, value);
                    }
                    else
                    {
                        throw new Exception("model value is null");
                    }
                })));
            return res;
        }

    }
}

簡(jiǎn)化后的依賴注入

記得UserControl.xaml里面綁定你ViewModel。這樣的話有代碼提示

    <UserControl.DataContext>
    	<!--選擇你自己的ViewModel-->
        <ViewModels:TitileViewModel />
    </UserControl.DataContext>
namespace BlankApp1.Views
{
    /// <summary>
    /// TitleView.xaml 的交互邏輯
    /// </summary>
    public partial class TitleView : UserControl
    {

        //這個(gè)只是為了代碼提示,不涉及邏輯。屬性類型按照需求更改。
        public MainWindow MainWindow { get; set; }

        //初始化依賴屬性構(gòu)造器
        public  static readonly MyWpfExtension<TitleView> MyWpfExtension = new MyWpfExtension<TitleView>();

        //這個(gè)是簡(jiǎn)化后的依賴屬性
        public static readonly DependencyProperty MainWindowProperty = 
            MyWpfExtension.DependencyPropertySet<MainWindow>("MainWindow", (view, value) =>
        {
            view.TitileViewModel.MainWindow = value;
        });

        /// <summary>
        /// DataContext的數(shù)據(jù)
        /// </summary>
        public TitileViewModel TitileViewModel { get; set; }

        public TitleView()
        {
            InitializeComponent();
            //拿到DataContext數(shù)據(jù)重定向
            TitileViewModel = (TitileViewModel)DataContext;
            TitileViewModel.UserName = "小王";
        }
    }
}

結(jié)尾

我后面要根據(jù)Vue的單向數(shù)據(jù)流,來(lái)構(gòu)思WPF 父子組件如何搭建。其實(shí)關(guān)鍵的就是數(shù)據(jù)流的問(wèn)題。根據(jù)Vue的單向數(shù)據(jù)流,父組件直接設(shè)置子組件的屬性,子組件通過(guò)回調(diào)函數(shù)回調(diào)變化。我打算寫個(gè)項(xiàng)目實(shí)戰(zhàn)一下。

WPF仿網(wǎng)易云 CSDN 博客專欄

WPF 用戶控件依賴注入賦值,WPF 入門知識(shí),wpf文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-722531.html

到了這里,關(guān)于WPF 用戶控件依賴注入賦值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【目標(biāo)檢測(cè)】-入門知識(shí)

    【目標(biāo)檢測(cè)】-入門知識(shí)

    回歸問(wèn)題 是指給定輸入變量(特征)和一個(gè)連續(xù)的輸出變量(標(biāo)簽),建立一個(gè)函數(shù)來(lái)預(yù)測(cè)輸出變量的值。換句話說(shuō),回歸問(wèn)題的目標(biāo)是預(yù)測(cè)一個(gè)連續(xù)的輸出值,例如預(yù)測(cè)房?jī)r(jià)、股票價(jià)格、銷售額等?;貧w問(wèn)題通常使用回歸分析技術(shù),例如線性回歸、多項(xiàng)式回歸、決策樹(shù)回歸

    2024年04月15日
    瀏覽(30)
  • 認(rèn)識(shí)Transformer:入門知識(shí)

    認(rèn)識(shí)Transformer:入門知識(shí)

    視頻鏈接: https://www.youtube.com/watch?v=ugWDIIOHtPAlist=PLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4index=60 Seq2Seq RNN不容易被平行化 提出用CNN來(lái)代替RNN,CNN 可以平行化,但是需要的層數(shù)比較深,才能看完所有的輸入內(nèi)容。 Self-Attention layer b1 到b4 是可以同時(shí)被算出。 可以用來(lái)取代RNN。 來(lái)源: Attentio

    2024年02月12日
    瀏覽(17)
  • 第一講:入門知識(shí)筆記

    python 變量無(wú)類型,但值里面有類型。 動(dòng)態(tài)類型語(yǔ)言(pythonjavascript) Subtraction reverse 3-digit number 判斷兩個(gè)浮點(diǎn)數(shù)是否相等不能直接用== 運(yùn)算優(yōu)先級(jí) operation precedence not and or 計(jì)算閏年 交換變量 name variable google.github.io/styleguide/pyguide.html python中的權(quán)限控制access control 默認(rèn)成員變量

    2024年01月25日
    瀏覽(22)
  • Hadoop詳細(xì)入門知識(shí)

    Hadoop詳細(xì)入門知識(shí)

    1.1 大數(shù)據(jù)的概念 最近幾年,IT行業(yè)最火的名詞中,少不了\\\"大數(shù)據(jù)\\\"、“人工智能”、“云計(jì)算”、“物聯(lián)網(wǎng)”、\\\"區(qū)塊鏈\\\"等等這些名詞。針對(duì)于**“大數(shù)據(jù)”**這個(gè)名詞,現(xiàn)在更是全國(guó)老百姓,老少皆知的一個(gè)詞語(yǔ)。但是什么是大數(shù)據(jù),除了IT行業(yè)的專業(yè)人士外,其他人乃至其

    2024年02月07日
    瀏覽(27)
  • TensorFlow入門知識(shí)

    TensorFlow入門知識(shí)

    TensorFlow是集齊了很多深度學(xué)習(xí)相關(guān)的算法的框架,你可以利用他搭建自己的神經(jīng)網(wǎng)絡(luò)模型。對(duì)于開(kāi)發(fā)者來(lái)說(shuō),告訴TensorFlow一批特征數(shù)據(jù)和最終的答案數(shù)據(jù),讓其通過(guò)一個(gè)神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練,最終輸出模型。模型將應(yīng)用于應(yīng)用端,給他一個(gè)輸入特征值,就能預(yù)測(cè)出一個(gè)答

    2024年02月08日
    瀏覽(45)
  • Java基礎(chǔ)入門知識(shí)

    以下是學(xué)習(xí)java必備的知識(shí) 目錄 前言 一、Java入門 二、基本數(shù)據(jù)類型與數(shù)組 標(biāo)識(shí)符與 2. 基本數(shù)據(jù)類型 3. 類型轉(zhuǎn)換運(yùn)算 4. 運(yùn)算符 5. 數(shù)組 6.控制結(jié)構(gòu)(與c使用一致) 總結(jié) Java語(yǔ)言是面向?qū)ο缶幊陶Z(yǔ)言,編寫的軟件與平臺(tái)無(wú)關(guān)。具有語(yǔ)法簡(jiǎn)單、面向?qū)ο?、穩(wěn)定、與平臺(tái)無(wú)

    2024年02月16日
    瀏覽(93)
  • 學(xué)習(xí)web入門知識(shí)匯總

    第一章 WEB簡(jiǎn)介 web流程:輸入網(wǎng)站訪問(wèn)網(wǎng)站之后向服務(wù)器發(fā)送請(qǐng)求,與數(shù)據(jù)庫(kù)交互后經(jīng)服務(wù)器返回請(qǐng)求結(jié)果,返回給用戶。 瀏覽器工作原理:通過(guò)域名獲取web服務(wù)器IP地址(DNS解析);訪問(wèn)web服務(wù)器。 web主要用到的技術(shù):html、javescript、css. URL的詳細(xì)格式:schema://host[:port#]/p

    2024年02月07日
    瀏覽(27)
  • 【C++】C++入門知識(shí)

    【C++】C++入門知識(shí)

    ??作者:日出等日落 ??專欄:C++ 不要去等誰(shuí),所有的不期而遇都在路上。 ? C++是在C的基礎(chǔ)之上,容納進(jìn)去了面向?qū)ο缶幊趟枷?,并增加了許多有用的庫(kù),以及編程范式等。熟悉C語(yǔ)言之后,對(duì)C++學(xué)習(xí)有一定的幫助 本章節(jié)主要目標(biāo): 1. 補(bǔ)充C語(yǔ)言語(yǔ)法的不足,以及C++是如何對(duì)

    2024年02月05日
    瀏覽(25)
  • C++ 進(jìn)制轉(zhuǎn)化入門知識(shí)(1)

    C++ 進(jìn)制轉(zhuǎn)化入門知識(shí)(1)

    進(jìn)制是一種用來(lái)表示數(shù)值的系統(tǒng)或方法,它是基于一個(gè)特定的基數(shù)來(lái)工作的。在我們常見(jiàn)的幾種進(jìn)制中,有: 1. **二進(jìn)制(基數(shù) 2)**: ? ?二進(jìn)制只用兩個(gè)數(shù)字:0和1。這是計(jì)算機(jī)內(nèi)部使用的數(shù)制系統(tǒng),因?yàn)橛?jì)算機(jī)的基本單元(比特)只有兩種狀態(tài):0或1。 2. **十進(jìn)制(基數(shù)

    2024年02月09日
    瀏覽(19)
  • ChatGPT原理——————深度學(xué)習(xí)入門知識(shí)

    ChatGPT原理——————深度學(xué)習(xí)入門知識(shí)

    隨著ChatGPT的爆火,ChatGPT的原理 ————深度學(xué)習(xí)這門技術(shù)也越來(lái)越被人們所重視。很多人都開(kāi)啟了學(xué)習(xí)深度學(xué)習(xí)的路程程,本文將詳細(xì)介紹深度學(xué)習(xí)的知識(shí)。 定義:深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一種,它利用包含多層結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)模型來(lái)建模和解決復(fù)雜的問(wèn)題。深度學(xué)習(xí)模型可

    2023年04月24日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包