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

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

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

引言

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

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

本文就以這個案例為例,來總結下最佳實踐。

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ù)對象
    }
}

XAML 里:

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

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

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

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

更好的做法是為控件定義一個依賴屬性,例如 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; // 在綁定時回寫
        }
    }

    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) { }
}

這樣,控件就有了一個獨立的 Graphic 屬性,外部綁定時可以很清晰地寫:

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

3. 在 ItemList 中使用

ListBox 中批量展示多個 GraphicInfo 時,就非常自然:

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

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

4. 對比與總結

使用 DataContext 的方式

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

使用依賴屬性的方式

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

最佳實踐

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

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

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

相關文章

  • C#使用加邊法計算行列式的值

    C#使用加邊法計算行列式的值

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

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

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

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

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

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

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

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

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

    C#序列化與反序列化實例

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

    C#類型轉換之顯式和隱式轉換詳解

    在C#編程中,類型轉換是一個核心概念,它允許我們在程序中處理不同類型的數(shù)據(jù),類型轉換可以分為兩大類:顯式類型轉換和隱式類型轉換,在這篇博客中,我們將深入探討這兩種類型轉換的定義、用法和重要性,需要的朋友可以參考下
    2024-07-07
  • 基于C#設計一個帶導航菜單的主界面

    基于C#設計一個帶導航菜單的主界面

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

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

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

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

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

最新評論

论坛| 东乡族自治县| 平南县| 淳安县| 叙永县| 延川县| 沙河市| 河北区| 乌兰县| 钦州市| 广德县| 银川市| 喜德县| 太仓市| 密云县| 贵溪市| 金川县| 尚义县| 合肥市| 三明市| 牟定县| 朝阳区| 龙海市| 修水县| 山东省| 板桥市| 庆安县| 顺义区| 中西区| 白水县| 西丰县| 克什克腾旗| 旌德县| 武安市| 犍为县| 宁南县| 禹城市| 黔西| 古田县| 景洪市| 铜鼓县|