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

WPF自定義控件綁定數(shù)據(jù)對(duì)象的最佳實(shí)踐

 更新時(shí)間:2025年09月22日 08:59:01   作者:code bean  
這篇文章主要介紹了WPF自定義控件數(shù)據(jù)綁定最佳實(shí)踐:直接使用DataContext簡(jiǎn)單但易沖突,依賴屬性更清晰且適合列表場(chǎng)景,推薦在需回寫或列表使用時(shí)采用依賴屬性模式,需要的朋友可以參考下

引言

在 WPF 中開發(fā)自定義控件時(shí),如何優(yōu)雅地綁定數(shù)據(jù)對(duì)象,是一個(gè)經(jīng)常遇到的問題。最近在實(shí)現(xiàn)一個(gè)自定義的 ImageView 控件時(shí),我遇到了一個(gè)典型場(chǎng)景:

  • 控件內(nèi)部需要使用第三方控件 HSmartWindowControlWPF 來顯示圖像;
  • 控件需要和業(yè)務(wù)對(duì)象 GraphicInfo 綁定,并且要把自身引用回寫到 GraphicInfo.View;
  • 控件還要支持在 ItemList(例如 ListBox)中批量使用。

本文就以這個(gè)案例為例,來總結(jié)下最佳實(shí)踐。

1. 直接使用 DataContext 的問題

最初的寫法是這樣的:

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();

    var hSmart = (HSmartWindowControlWPF)GetTemplateChild("PART_hSmart");
    hSmart.Loaded += Hsmart_Loaded;
    hSmart.HMouseMove += HSmart_HMouseMove;

    if (DataContext is GraphicInfo info)
    {
        info.View = this; // 子類控件回寫到數(shù)據(jù)對(duì)象
    }
}

XAML 里:

<local:ImageView DataContext="{Binding MyGraphic}" />

這種方式雖然能用,但有幾個(gè)問題:

  • 控件內(nèi)部和外部公用了同一個(gè) DataContext,如果控件內(nèi)部還需要 MVVM 綁定,會(huì)和外部沖突。
  • ItemList 中使用時(shí)不夠直觀,容易出錯(cuò)。

2. 定義依賴屬性(推薦)

更好的做法是為控件定義一個(gè)依賴屬性,例如 Graphic

public class ImageView : Control
{
    static ImageView()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageView),
            new FrameworkPropertyMetadata(typeof(ImageView)));
    }

    // 定義依賴屬性
    public GraphicInfo Graphic
    {
        get => (GraphicInfo)GetValue(GraphicProperty);
        set => SetValue(GraphicProperty, value);
    }

    public static readonly DependencyProperty GraphicProperty =
        DependencyProperty.Register(nameof(Graphic), typeof(GraphicInfo), typeof(ImageView),
            new PropertyMetadata(null, OnGraphicChanged));

    private static void OnGraphicChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is ImageView view && e.NewValue is GraphicInfo info)
        {
            info.View = view; // 在綁定時(shí)回寫
        }
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        var hSmart = (HSmartWindowControlWPF)GetTemplateChild("PART_hSmart");

        if (hSmart != null)
        {
            hSmart.Loaded += Hsmart_Loaded;
            hSmart.HMouseMove += HSmart_HMouseMove;
        }
    }

    private void Hsmart_Loaded(object sender, RoutedEventArgs e) { }
    private void HSmart_HMouseMove(object sender, HMouseEventArgs e) { }
}

這樣,控件就有了一個(gè)獨(dú)立的 Graphic 屬性,外部綁定時(shí)可以很清晰地寫:

<local:ImageView Graphic="{Binding MyGraphic}" />

3. 在 ItemList 中使用

ListBox 中批量展示多個(gè) GraphicInfo 時(shí),就非常自然:

<ListBox ItemsSource="{Binding Graphics}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <local:ImageView Graphic="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

這里的 Binding 就是每個(gè) GraphicInfo,通過依賴屬性綁定到控件,不會(huì)和 DataContext 混用。

4. 對(duì)比與總結(jié)

使用 DataContext 的方式

? 簡(jiǎn)單,少寫一個(gè)依賴屬性
? 容易和控件內(nèi)部 MVVM 沖突
? 在 ItemList 中語義不清晰

使用依賴屬性的方式

? 更加清晰,控件的 DataContext 可以獨(dú)立使用
? 在 ItemList 中使用更自然
? 可以在依賴屬性的回調(diào)里處理邏輯(如回寫 View

最佳實(shí)踐

  • 如果控件只是簡(jiǎn)單的 UI 展示,內(nèi)部不需要額外綁定,可以用 DataContext。
  • 如果控件要在 ItemList 中使用,或者內(nèi)部還需要用自己的 DataContext,推薦使用依賴屬性。

我個(gè)人在項(xiàng)目里最終采用了 依賴屬性模式,不僅解耦了數(shù)據(jù)和視圖,還能方便在列表場(chǎng)景下使用。

以上就是WPF自定義控件綁定數(shù)據(jù)對(duì)象的最佳實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于WPF自定義控件綁定數(shù)據(jù)對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#使用加邊法計(jì)算行列式的值

    C#使用加邊法計(jì)算行列式的值

    這篇文章主要介紹了C#使用加邊法計(jì)算行列式的值,實(shí)例分析了C#加邊法計(jì)算行列式的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 訪問修飾符(C# 編程指南)

    訪問修飾符(C# 編程指南)

    所有類型和類型成員都具有可訪問性級(jí)別,用來控制是否可以在您程序集的其他代碼中或其他程序集中使用它們。您在聲明類型或成員時(shí)使用以下訪問修飾符之一來指定其可訪問性
    2011-02-02
  • c#字符串編碼問題的處理解決

    c#字符串編碼問題的處理解決

    這篇文章主要介紹了c#字符串編碼問題的處理解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C#二進(jìn)制讀寫B(tài)inaryReader、BinaryWriter、BinaryFormatter

    C#二進(jìn)制讀寫B(tài)inaryReader、BinaryWriter、BinaryFormatter

    這篇文章介紹了C#二進(jìn)制讀寫B(tài)inaryReader、BinaryWriter、BinaryFormatter的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 基于WPF平臺(tái)使用純C#實(shí)現(xiàn)動(dòng)態(tài)處理json字符串

    基于WPF平臺(tái)使用純C#實(shí)現(xiàn)動(dòng)態(tài)處理json字符串

    在當(dāng)今的軟件開發(fā)領(lǐng)域,數(shù)據(jù)的交換與存儲(chǔ)變得愈發(fā)頻繁,JSON作為一種輕量級(jí)的數(shù)據(jù)交換格式,在 WPF平臺(tái)開發(fā)的桌面應(yīng)用里,我們常常需要與各種數(shù)據(jù)源交互,動(dòng)態(tài)處理JSON字符串就成為了一項(xiàng)必備技能,本文將深入探討如何在 WPF 平臺(tái)上,僅使用純C#代碼實(shí)現(xiàn)對(duì)JSON字符串的動(dòng)態(tài)處理
    2025-01-01
  • C#序列化與反序列化實(shí)例

    C#序列化與反序列化實(shí)例

    這篇文章主要介紹了C#序列化與反序列化的實(shí)現(xiàn)方法,實(shí)例分析了序列化與反序列化的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-01-01
  • C#類型轉(zhuǎn)換之顯式和隱式轉(zhuǎn)換詳解

    C#類型轉(zhuǎn)換之顯式和隱式轉(zhuǎn)換詳解

    在C#編程中,類型轉(zhuǎn)換是一個(gè)核心概念,它允許我們?cè)诔绦蛑刑幚聿煌愋偷臄?shù)據(jù),類型轉(zhuǎn)換可以分為兩大類:顯式類型轉(zhuǎn)換和隱式類型轉(zhuǎn)換,在這篇博客中,我們將深入探討這兩種類型轉(zhuǎn)換的定義、用法和重要性,需要的朋友可以參考下
    2024-07-07
  • 基于C#設(shè)計(jì)一個(gè)帶導(dǎo)航菜單的主界面

    基于C#設(shè)計(jì)一個(gè)帶導(dǎo)航菜單的主界面

    這篇文章主要為大家詳細(xì)介紹了如何基于C#設(shè)計(jì)一個(gè)帶導(dǎo)航菜單的主界面,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • C#程序如何調(diào)用C++?dll詳細(xì)教程

    C#程序如何調(diào)用C++?dll詳細(xì)教程

    C#和C++形成的DLL有一層天然的屏障,并不能簡(jiǎn)單地互相調(diào)用,想要C#工程調(diào)用c++dll,需要先在其外部包裹上clr?c++的外殼,本篇文章給大家分享了C#調(diào)用C++?dll的詳細(xì)步驟和方法,有興趣的朋友可以參考學(xué)習(xí)下
    2018-07-07
  • C#子線程執(zhí)行完后通知主線程的方法

    C#子線程執(zhí)行完后通知主線程的方法

    下面小編就為大家?guī)硪黄狢#子線程執(zhí)行完后通知主線程的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12

最新評(píng)論

原阳县| 胶州市| 云和县| 永昌县| 阿巴嘎旗| 松潘县| 北宁市| 澳门| 介休市| 睢宁县| 炎陵县| 夏津县| 大关县| 锦屏县| 孟州市| 海林市| 四子王旗| 武定县| 洛扎县| 双桥区| 阆中市| 徐闻县| 闻喜县| 云浮市| 新郑市| 革吉县| 常熟市| 淳化县| 秭归县| 略阳县| 鄄城县| 桃园县| 灌阳县| 枣阳市| 高清| 孟州市| 富宁县| 常山县| 泾阳县| 佛学| 襄垣县|