wpf Behaviors庫實現支持多選操作進行后臺綁定數據的ListView

請添加圖片描述

 <ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended"   VerticalAlignment="Stretch" HorizontalAlignment="Stretch"><ListView.ContextMenu><ContextMenu><MenuItem Header="刪除" Command="{Binding DeleteSelectedItemCommand}"/></ContextMenu></ListView.ContextMenu><i:Interaction.Behaviors><behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/></i:Interaction.Behaviors><ListView.View><GridView><GridViewColumn Header="方案名"  DisplayMemberBinding="{Binding Name}"/></GridView></ListView.View></ListView>

1. ListView控件的定義

<ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
  • ItemsSource="{Binding SchemeItems}"
    • 這是數據綁定的屬性,表示ListView的數據源綁定到視圖模型(ViewModel)中的SchemeItems屬性。
    • SchemeItems應該是一個集合類型(如ObservableCollection),其中存儲了要顯示在ListView中的數據項。
  • SelectionMode="Extended"
    • 設置ListView的選中模式為“擴展模式”,允許用戶通過按下CtrlShift鍵選擇多個項目。
  • VerticalAlignment="Stretch"HorizontalAlignment="Stretch"
    • 這兩個屬性設置ListView在父容器中垂直和水平方向上拉伸以填充可用空間。

2. 上下文菜單(ContextMenu

<ListView.ContextMenu><ContextMenu><MenuItem Header="刪除" Command="{Binding DeleteSelectedItemCommand}"/></ContextMenu>
</ListView.ContextMenu>
  • ContextMenu
    • 定義了ListView的上下文菜單,即用戶右鍵單擊ListView時顯示的菜單。
  • MenuItem Header="刪除" Command="{Binding DeleteSelectedItemCommand}"
    • 定義了一個菜單項,標題為“刪除”。
    • Command="{Binding DeleteSelectedItemCommand}"
      • 綁定了一個命令,當用戶點擊“刪除”菜單項時,會觸發視圖模型中的DeleteSelectedItemCommand命令。
      • 這個命令通常用于刪除選中的項目。

3. 行為(Interaction.Behaviors

<i:Interaction.Behaviors><behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
  • Interaction.Behaviors
    • 使用了System.Windows.Interactivity命名空間(通常通過xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"引入)來添加行為。
  • behaviors:SelectedItemsBehavior
    • 這是一個自定義行為,可能是為了處理ListView的多選項目。
  • SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"
    • 將行為的SelectedItems屬性與視圖模型中的SelectedSchemeItems屬性進行雙向綁定。
    • 這樣,當用戶在ListView中選擇項目時,SelectedSchemeItems會自動更新,反之亦然。

4. ListView的視圖(ListView.View

<ListView.View><GridView><GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"/></GridView>
</ListView.View>
  • ListView.View
    • 定義了ListView的顯示方式,這里使用了GridView,即表格視圖。
  • GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"
    • 定義了一個表格列,標題為“方案名”。
    • DisplayMemberBinding="{Binding Name}"
      • 表示該列顯示的數據項的Name屬性值。
      • 假設SchemeItems集合中的每個項目都有一個Name屬性,那么這個屬性的值將顯示在該列中。
public class SelectedItemsBehavior : Behavior<ListView>
{public static readonly DependencyProperty SelectedItemsProperty =DependencyProperty.Register(nameof(SelectedItems),typeof(ObservableCollection<SchemeItem>),typeof(SelectedItemsBehavior),new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));public ObservableCollection<SchemeItem> SelectedItems{get => (ObservableCollection<SchemeItem>)GetValue(SelectedItemsProperty);set => SetValue(SelectedItemsProperty, value);}protected override void OnAttached(){base.OnAttached();AssociatedObject.SelectionChanged += OnSelectionChanged;}protected override void OnDetaching(){AssociatedObject.SelectionChanged -= OnSelectionChanged;base.OnDetaching();}private void OnSelectionChanged(object sender, SelectionChangedEventArgs e){SelectedItems = new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>());}
}

下面代碼定義了一個名為SelectedItemsBehavior的行為類,用于擴展ListView的功能,特別是處理多選項目并將其與視圖模型綁定:

1. 類定義

public class SelectedItemsBehavior : Behavior<ListView>
  • Behavior<ListView>
    • 這是一個從System.Windows.Interactivity.Behavior<T>繼承的類,專門用于為ListView控件添加行為。
    • Behavior<T>是WPF中用于擴展控件功能的機制,允許開發者通過附加行為來增強控件的功能,而無需修改控件本身的代碼。

2. 依賴屬性(DependencyProperty

public static readonly DependencyProperty SelectedItemsProperty =DependencyProperty.Register(nameof(SelectedItems),typeof(ObservableCollection<SchemeItem>),typeof(SelectedItemsBehavior),new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
  • DependencyProperty.Register
    • 定義了一個名為SelectedItemsProperty的依賴屬性,用于存儲選中的項目集合。
    • nameof(SelectedItems):屬性的名稱。
    • typeof(ObservableCollection<SchemeItem>):屬性的類型,表示選中的項目是一個ObservableCollection<SchemeItem>集合。
    • typeof(SelectedItemsBehavior):依賴屬性所屬的類。
    • FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
      • 設置了默認值為null
      • 設置了BindsTwoWayByDefault選項,表示該屬性默認支持雙向綁定。

3. SelectedItems屬性

public ObservableCollection<SchemeItem> SelectedItems
{get => (ObservableCollection<SchemeItem>)GetValue(SelectedItemsProperty);set => SetValue(SelectedItemsProperty, value);
}
  • 這是一個包裝了SelectedItemsProperty依賴屬性的CLR屬性。
  • 通過GetValueSetValue方法,可以方便地獲取和設置SelectedItemsProperty的值。

4. 附加行為(OnAttached

protected override void OnAttached()
{base.OnAttached();AssociatedObject.SelectionChanged += OnSelectionChanged;
}
  • OnAttached
    • 當行為被附加到ListView控件時,會調用此方法。
    • AssociatedObject
      • 表示行為所附加的控件,在這里是ListView
    • AssociatedObject.SelectionChanged += OnSelectionChanged
      • 訂閱了ListViewSelectionChanged事件,當ListView的選中項發生變化時,會觸發OnSelectionChanged方法。

5. 分離行為(OnDetaching

protected override void OnDetaching()
{AssociatedObject.SelectionChanged -= OnSelectionChanged;base.OnDetaching();
}
  • OnDetaching
    • 當行為從ListView控件分離時,會調用此方法。
    • AssociatedObject.SelectionChanged -= OnSelectionChanged
      • 取消訂閱SelectionChanged事件,以避免內存泄漏。

6. 處理選中項變化(OnSelectionChanged

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{SelectedItems = new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>());
}
  • OnSelectionChanged
    • ListView的選中項發生變化時,此方法會被觸發。
    • AssociatedObject.SelectedItems
      • 獲取ListView當前選中的項目集合。
    • Cast<SchemeItem>()
      • 將選中的項目集合轉換為SchemeItem類型的集合。
    • new ObservableCollection<SchemeItem>(...)
      • 創建一個新的ObservableCollection<SchemeItem>實例,并將其賦值給SelectedItems屬性。
      • 這樣,SelectedItems屬性會實時更新,反映當前ListView的選中項。

總結

SelectedItemsBehavior類的作用是:

  1. 擴展ListView的功能
    • 通過行為機制,為ListView添加了對多選項目的支持,并將其與視圖模型中的ObservableCollection<SchemeItem>屬性進行雙向綁定。
  2. 自動更新選中項
    • 當用戶在ListView中選擇或取消選擇項目時,SelectedItems屬性會自動更新,確保視圖模型中的數據與用戶界面保持一致。

通過在XAML中使用<behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>,可以將ListView的選中項與視圖模型中的SelectedSchemeItems屬性綁定,實現數據的雙向同步。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83807.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

50個JAVA常見代碼大全:學完這篇從Java小白到架構師

50個JAVA常見代碼大全&#xff1a;學完這篇從Java小白到架構師 Java&#xff0c;作為一門流行多年的編程語言&#xff0c;始終占據著軟件開發領域的重要位置。無論是初學者還是經驗豐富的程序員&#xff0c;掌握Java中常見的代碼和概念都是至關重要的。本文將列出50個Java常用…

【Linux手冊】馮諾依曼體系結構

目錄 前言 五大組件 數據信號 存儲器&#xff08;內存&#xff09;有必要嗎 常見面試題 前言 馮諾依曼體系結構是當代計算機基本架構&#xff0c;馮諾依曼體系有五大組件&#xff0c;通過這五大組件直觀的描述了計算機的工作原理&#xff1b;學習馮諾依曼體系可以讓給我們更…

10_聚類

描述 聚類&#xff08;clustering&#xff09;是將數據集劃分成組的任務&#xff0c;這些組叫作簇&#xff08;cluster&#xff09;。其目標是劃分數據&#xff0c;使得一個簇內的數據點非常相似且不同簇內的數據點非常不同。與分類算法類似&#xff0c;聚類算法為每個數據點分…

【SSM】SpringBoot學習筆記1:SpringBoot快速入門

前言&#xff1a; 文章是系列學習筆記第9篇。基于黑馬程序員課程完成&#xff0c;是筆者的學習筆記與心得總結&#xff0c;供自己和他人參考。筆記大部分是對黑馬視頻的歸納&#xff0c;少部分自己的理解&#xff0c;微量ai解釋的內容&#xff08;ai部分會標出&#xff09;。 …

國產高性能pSRAM選型指南:CSS6404LS-LI 64Mb QSPI偽靜態存儲器

一、芯片基礎特性 核心參數 容量 &#xff1a;64Mb&#xff08;8M 8bit&#xff09;電壓 &#xff1a;單電源供電 2.7-3.6V &#xff08;兼容3.3V系統&#xff09;接口 &#xff1a;Quad-SPI&#xff08;QPI/SPI&#xff09;同步模式封裝 &#xff1a; SOP-8L (150mil) &#…

Cilium動手實驗室: 精通之旅---4.Cilium Gateway API - Lab

Cilium動手實驗室: 精通之旅---4.Cilium Gateway API - Lab 1. 環境準備2. API 網關--HTTP2.1 部署應用2.2 部署網關2.3 HTTP路徑匹配2.4 HTTP頭匹配 3. API網關--HTTPS3.1 創建TLS證書和私鑰3.2 部署HTTPS網關3.3 HTTPS請求測試 4. API網關--TLS 路由4.1 部署應用4.2 部署網關…

20250605在微星X99主板中配置WIN10和ubuntu22.04.6雙系統啟動的引導設置

rootrootrootroot-X99-Turbo:~$ sudo apt-get install boot-repair rootrootrootroot-X99-Turbo:~$ sudo add-apt-repository ppa:yannubuntu/boot-repair rootrootrootroot-X99-Turbo:~$ sudo apt-get install boot-repair 20250605在微星X99主板中配置WIN10和ubuntu22.04.6雙…

MyBatis之測試添加功能

1. 首先Mybatis為我們提供了一個操作數據庫的會話對象叫Sqlsession&#xff0c;所以我們就需要先獲取sqlsession對象&#xff1a; //加載核心配置文件 InputStream is Resources.getResourceAsStream("mybatis-config.xml"); //獲取sqlSessionFactoryBuilder(是我…

[論文閱讀] 人工智能+軟件工程 | MemFL:給大模型裝上“項目記憶”,讓軟件故障定位又快又準

【論文解讀】MemFL&#xff1a;給大模型裝上“項目記憶”&#xff0c;讓軟件故障定位又快又準 論文信息 arXiv:2506.03585 Improving LLM-Based Fault Localization with External Memory and Project Context Inseok Yeo, Duksan Ryu, Jongmoon Baik Subjects: Software Engi…

Java開發中復用公共SQL的方法

在一次Java后端開發的面試中&#xff0c;面試官問了我一個問題&#xff1a;“你在寫代碼時會復用公共SQL嗎&#xff1f;如果會的話&#xff0c;能詳細介紹一下你是如何實現的嗎&#xff1f;”這個問題讓我眼前一亮&#xff0c;因為在實際項目中&#xff0c;SQL復用確實是一個非…

C#學習26天:內存優化的幾種方法

1.減少對象創建 使用場景&#xff1a; 在循環或密集計算中頻繁創建對象時。涉及大量短生命周期對象的場景&#xff0c;比如日志記錄或字符串拼接。游戲開發中&#xff0c;需要頻繁更新對象狀態時。 說明&#xff1a; 重用對象可以降低內存分配和垃圾回收的開銷。使用對象池…

【opencv】基礎知識到進階(更新中)

安裝&#xff1a;pip install opencv-python 入門案例 讀取圖片 本節我們將來學習,如何使用opencv顯示一張圖片出來,我們首先需要掌握一條圖片讀取的api cv.imread("圖片路徑","讀取的方式") # 圖片路徑: 需要在工程目錄中,或者一個文件的絕對路徑 # 讀取…

【Part 3 Unity VR眼鏡端播放器開發與優化】第二節|VR眼鏡端的開發適配與交互設計

文章目錄 《VR 360全景視頻開發》專欄Part 3&#xff5c;Unity VR眼鏡端播放器開發與優化第一節&#xff5c;基于Unity的360全景視頻播放實現方案第二節&#xff5c;VR眼鏡端的開發適配與交互設計一、Unity XR開發環境與設備適配1.1 啟用XR Plugin Management1.2 配置OpenXR與平…

SQL進階之旅 Day 16:特定數據庫引擎高級特性

【SQL進階之旅 Day 16】特定數據庫引擎高級特性 開篇 在“SQL進階之旅”系列的第16天&#xff0c;我們將探討特定數據庫引擎的高級特性。這些特性通常為某些特定場景設計&#xff0c;能夠顯著提升查詢性能或簡化復雜任務。本篇文章將覆蓋MySQL、PostgreSQL和Oracle的核心高級…

c++算法學習4——廣度搜索bfs

一、引言&#xff1a;探索迷宮的智能方法 在解決迷宮最短路徑問題時&#xff0c;廣度優先搜索&#xff08;BFS&#xff09;是一種高效而優雅的算法。與深度優先搜索&#xff08;DFS&#xff09;不同&#xff0c;BFS采用"由近及遠"的搜索策略&#xff0c;逐層探索所有…

4.RV1126-OPENCV 圖像輪廓識別

一.圖像識別API 1.圖像識別作用 它常用于視覺任務、目標檢測、圖像分割等等。在 OPENCV 中通常使用 Canny 函數、findContours 函數、drawContours 函數結合在一起去做輪廓的形檢測。 2.常用的API findContours 函數&#xff1a;用于尋找圖片的輪廓&#xff0c;并把所有的數…

Qt多線程訪問同一個數據庫源碼分享(基于Sqlite實現)

Qt多線程訪問同一個數據庫源碼分享&#xff08;基于Sqlite實現&#xff09; 一、實現難點線程安全問題死鎖風險連接管理問題數據一致性性能瓶頸跨線程信號槽最佳實踐建議 二、源碼分享三、測試1、新建一個多線程類2、開啟多線程插入數據 一、實現難點 多線程環境下多個線程同時…

雙空間知識蒸餾用于大語言模型

Dual-Space Knowledge Distillation for Large Language Models 發表&#xff1a;EMNLP 2024 機構&#xff1a;Beijing Key Lab of Traffic Data Analysis and Mining 連接&#xff1a;https://aclanthology.org/2024.emnlp-main.1010.pdf 代碼&#xff1a;GitHub - songmz…

貪心算法應用:多重背包啟發式問題詳解

貪心算法應用&#xff1a;多重背包啟發式問題詳解 多重背包問題是經典的組合優化問題&#xff0c;也是貪心算法的重要應用場景。本文將全面深入地探討Java中如何利用貪心算法解決多重背包問題。 多重背包問題定義 **多重背包問題(Multiple Knapsack Problem)**是背包問題的變…

ES6 Promise 狀態機

狀態機&#xff1a;抽象的計算模型&#xff0c;根據特定的條件或者信號切換不同的狀態 一、Promise 是什么&#xff1f; 簡單來說&#xff0c;Promise 就是一個“承諾對象”。在ES6 里&#xff0c;有些代碼執行起來需要點時間&#xff0c;比如加載文件、等待網絡請求或者設置…