WPF MVVM入門系列教程(TabControl綁定到列表并單獨指定每一頁內容)

在以前的開發過程中,對于TabControl控件,我一般是習慣直接定義TabItem,在TabItem下布局,并進行綁定。

類似這樣

 1  <TabControl ItemsSource="{Binding TabList}" SelectedIndex="0">2      <TabItem Header="Tab1">3           <Grid>4               <Label Content="{Binding  XXX}"/>5           </Grid>6      </TabItem>7      <TabItem Header="Tab2">8           <Grid>9               <Button Content="{Binding  XXX}" Command="{Binding XXX}"/>
10           </Grid>
11      </TabItem>
12  </TabControl>    

我們也可以單獨定義每一個Tab頁的ViewModel和布局。

1、創建一個Tab頁公用的ViewModel

這個類用于顯示Tab頁的標題等公共屬性。

 1     public class TabViewModel : ObservableObject2     {3         private string headerName;4 5         public string HeaderName 6         { 7             get => headerName; 8             set => SetProperty(ref headerName,value); 9         }
10     }

2、定義每一個Tab頁的ViewModel

假設我這里是設置兩頁,TabATabB

TabA顯示一個詳情文本

TabB顯示一個圖片

TabToolAViewModel.cs

 1     public class TabToolAViewModel : TabViewModel2     {3         private string detail;4         public string Detail { get => detail; set => SetProperty(ref detail,value); }5 6         public TabToolAViewModel()7         {8             HeaderName = "工具A";9         }
10 
11     }

TabToolBViewModel.cs

 1     public class TabToolBViewModel : TabViewModel2     {3         private string imagePath;4         public string ImagePath { get => imagePath; set => SetProperty(ref imagePath,value); }5 6         public TabToolBViewModel()7         {8             HeaderName = "工具B";9         }
10 
11     }

3、創建主界面

MainWindow.xaml

 1 <Window x:Class="WPFTabMVVMDemo.MainWindow"2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"6         mc:Ignorable="d"7         Title="MainWindow" Height="450" Width="800">8     <TabControl ItemsSource="{Binding TabList}" SelectedIndex="0">9         <TabControl.ItemTemplate>
10             <DataTemplate>
11                 <ContentPresenter Content="{Binding HeaderName}"></ContentPresenter>
12             </DataTemplate>
13         </TabControl.ItemTemplate>
14     </TabControl>
15 </Window>

4、創建主界面的ViewModel

MainWindowViewModel.cs

 1  public class MainWindowViewModel : ObservableObject2  {3      private ObservableCollection<TabViewModel> tabList = new ObservableCollection<TabViewModel>();4 5      public ObservableCollection<TabViewModel> TabList { get => tabList; set => SetProperty(ref tabList,value); }6 7      public MainWindowViewModel()8      {9          tabList.Add(new TabToolAViewModel() {Detail = "詳情...." });
10          tabList.Add(new TabToolBViewModel() { ImagePath = "https://img2.baidu.com/it/u=3115165460,1153722234&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750" });
11      }
12 
13  }

我們將MainWindowViewModel.cs綁定到MainWindow上后

1  public MainWindow()
2  {
3      InitializeComponent();
4 
5      this.DataContext = new MainWindowViewModel();
6  }

運行效果如下:

可以看到這里顯示的是TabToolAViewModel的字樣,因為這里TabToolAViewModel并沒有對應到具體的View上面。

5、創建單獨的視圖

接下來我們就可以單獨的創建每個Tab頁要顯示的內容了

TabAView.xaml

TabA顯示一個詳情文本

 1 <UserControl x:Class="WPFTabMVVMDemo.Views.ToolAView"2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6              xmlns:local="clr-namespace:WPFTabMVVMDemo.Views"7              mc:Ignorable="d" 8              d:DesignHeight="450" d:DesignWidth="800">9     <StackPanel>
10         <Label Content="{Binding Detail}"></Label>
11     </StackPanel>
12 </UserControl>

TabBView.xaml

TabB顯示一個圖片

 1 <UserControl x:Class="WPFTabMVVMDemo.Views.ToolBView"2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6              xmlns:local="clr-namespace:WPFTabMVVMDemo.Views"7              mc:Ignorable="d" 8              d:DesignHeight="450" d:DesignWidth="800">9     <Grid>
10         <Image Source="{Binding ImagePath}"></Image>   
11     </Grid>
12 </UserControl>

6、創建視圖和ViewModel的映射

有了兩個單獨的視圖以后,如何將它和它們對應的ViewModel綁定起來呢?

此時我們可以創建一個資源字典,并定義數據模板,用于ViewModelView的映射?

ViewTemplate.xaml

 1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"2                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:view="clr-namespace:WPFTabMVVMDemo.Views"3                     xmlns:local="clr-namespace:WPFTabMVVMDemo">4 5     <DataTemplate 6      DataType="{x:Type 7          local:TabToolAViewModel}">8         <view:ToolAView></view:ToolAView>9     </DataTemplate>
10     
11     <DataTemplate 
12 DataType="{x:Type 
13     local:TabToolBViewModel}">
14         <view:ToolBView></view:ToolBView>
15     </DataTemplate>
16 </ResourceDictionary>

7、使用視圖和ViewModel的映射?

然后在需要使用的地方,引用 這個資源字典就可以了。

我們這里是在主窗口中使用

就在MainWindow.xml中添加如下引用?

1   <Window.Resources>
2       <ResourceDictionary Source="ViewTemplate.xaml"></ResourceDictionary>
3   </Window.Resources>

添加后,運行效果如下:

這樣我們就可以將TabControl綁定到一個列表,并單獨指定每一個Tab頁的標題和內容。

示例代碼

下載

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

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

相關文章

L2CAP 面向連接信道(CoC)在 BLE 中的應用:建立、流控與數據傳輸

在物聯網(IoT)蓬勃發展的今天,低功耗藍牙(BLE)技術因其高效節能、低成本等特性,成為短距離無線通信的首選方案。作為 BLE 協議棧的核心組件,邏輯鏈路控制與適配協議(L2CAP)的面向連接信道(CoC)承擔著數據傳輸的關鍵任務。本文將深入解析 L2CAP CoC 在 BLE 中的應用,…

醫療AI與醫院數據倉庫的智能化升級:異構采集、精準評估與高效交互的融合方向(上)

摘要: 隨著醫療信息化建設的深入,醫院數據倉庫(Data Warehouse, DW)作為醫療AI應用的核心數據底座,其效能直接決定智能化轉型的深度與廣度。本文聚焦醫療AI驅動下醫院數據倉庫的三大關鍵升級功能——異構采集支持數據庫體檢與智能SQL分析、評估引擎重構實現六大數據庫精準…

2015-2018年咸海流域1km歸一化植被指數8天合成數據集

數據集摘要數據集包含2015年-2018年咸海流域NDVI 8天均值數據。提取美國國家航空航天局中分辨率成像光譜儀MOD13A2產品第一波段作為歸一化植被指數數據&#xff0c;乘以比例因子0.0001&#xff0c;疊加咸海流域邊界數據&#xff0c;裁切后得到咸海流域范圍內的NDVI月均值數據。…

Kafka消息持久化機制全解析:存儲原理與實戰場景

目錄 引言? 一、Kafka消息持久化的核心目標 二、底層存儲機制深度剖析 1.【文件系統分層】——日志分組 日志段 核心結構 示例目錄結構 2.【消息寫入流程】——從內存到磁盤的旅程?? 3.【默認存儲參數】——生產環境的黃金比例 三、典型應用場景與案例實戰 案例1…

Python訓練營打卡Day41-Grad-CAM與Hook函數

知識點回顧回調函數lambda函數hook函數的模塊鉤子和張量鉤子Grad-CAM的示例 作業&#xff1a;理解下今天的代碼即可 在深度學習中&#xff0c;我們經常需要查看或修改模型中間層的輸出或梯度。然而&#xff0c;標準的前向傳播和反向傳播過程通常是一個黑盒&#xff0c;我們很難…

使用VBA宏批量修改Word中表格題注格式

目錄&#x1f4c2; 使用步驟? 方式一&#xff1a;應用已有樣式&#xff08;推薦&#xff09;代碼實現說明? 方式二&#xff1a;手動設置字體格式&#xff08;無需預定義樣式&#xff09;代碼實現參數說明如何運行宏&#xff1f;補充建議總結在撰寫論文、技術文檔或報告時&…

Redis面試精講 Day 27:Redis 7.0/8.0新特性深度解析

【Redis面試精講 Day 27】Redis 7.0/8.0新特性深度解析 在“Redis面試精講”系列的第27天&#xff0c;我們將聚焦Redis最新版本——7.0與8.0的核心新特性。隨著Redis從內存數據庫向云原生、高可用、高性能中間件持續演進&#xff0c;7.0和8.0版本引入了多項顛覆性改進&#xf…

使用自制的NTC測量模塊測試Plecs的熱仿真效果

之前構建的 NTC 溫度測量模型是進行 PLECS 熱仿真的完美起點和核心組成部分。 PLECS 的強大之處在于它能夠進行多域仿真,特別是電-熱聯合仿真。您可以將電路仿真(包括您的 NTC 測量模型)與熱仿真(散熱器、熱容、熱阻等)無縫地結合起來。 電-熱聯合仿真原理 整個仿真閉環…

C語言初學者筆記【動態內存管理】

、 文章目錄一、為什么需要動態內存分配&#xff1f;二、malloc 和 free1. malloc2. free三、calloc 和 realloc1. calloc2. realloc四、常見的動態內存錯誤1. 對 NULL 解引用2. 越界訪問3. 對非動態內存使用 free4. 釋放部分動態內存5. 多次釋放同一塊內存6. 內存泄漏五、動態…

AI模型部署 - 大語言模型(LLM)部署技術與框架

目錄 一、 大語言模型部署的核心挑戰與關鍵技術 二、 主流開源部署框架深度解析 2.1. Ollama:本地部署的極簡主義者 2.2. Hugging Face TGI (Text Generation Inference) 2.3. vLLM:為吞吐量而生 2.4. sglang:面向復雜提示與結構化輸出的革新者 三、 特定硬件與云平臺…

Windows11 GeForce GTX 1060 CUDA+CUDNN+Pytorch 下載及安裝

一、查看顯卡型號信息 系統&#xff1a;Windows11 顯卡&#xff1a;GeForce GTX 1060 型號&#xff1a; &#xff08;1&#xff09;搜索 NVIDIA&#xff0c;選擇 NVIDIA Control Panel&#xff08;2&#xff09;打開 NVIDIA control Panel&#xff0c;打開系統信息&#xff0c;…

在通義靈碼中配置MCP服務

目錄 查找mcp列表 通義靈碼中配置MCP 使用方式 STDIO (Standard Input/Output) 組成部分&#xff1a; SSE (Server-Sent Events) 特點&#xff1a; 主要區別對比 配置方式 配置優先級 個人設置 項目設置 驗證 通過MCP調用高德地圖 查找mcp列表 打開ModelScope - …

網絡中的IO問題(五種常見的IO方式)

什么是高效的IO&#xff1f; 正常情況下&#xff0c;IO等拷貝 高效的IO拷貝&#xff08;即讓IO盡量不等&#xff09; 為什么我們平常玩電腦的時候&#xff0c;感覺不到等待的過程呢&#xff1f; 任何通信場景&#xff0c;IO通信場景&#xff0c;效率一定是有上限的. 花盆里&am…

JAVA核心基礎篇-修飾符

Java 修飾符主要用于定義類、方法或變量&#xff0c;通常放在語句的最前端&#xff0c;可分為訪問修飾符和非訪問修飾符兩類。一、訪問修飾符public&#xff1a;對所有類可見&#xff0c;可用于類、接口、變量和方法。被聲明為 public 的類、方法、構造方法和接口能夠被任何其他…

筆試——Day46

文章目錄第一題題目思路代碼第二題題目思路代碼第三題題目思路代碼第一題 題目 AOE還是單體&#xff1f; 思路 貪心 剩余怪物數量 >x時&#xff0c;使用AOE&#xff1b;否則使用單體 代碼 #include <iostream> #include <algorithm> using namespace std;…

零工合規挑戰:蓋雅以智能安全體系重構企業用工風控

國家稅務總局發布的2025年第15號公告&#xff0c;將多種互聯網平臺企業納入涉稅信息報送范圍&#xff0c;這讓靈活用工平臺的數據和網絡安全問題成為行業關注的焦點。在海量零工信息和企業數據流轉的過程中&#xff0c;數據泄露和網絡攻擊的風險不斷上升&#xff0c;迫使平臺在…

非線性規劃學習筆記

非線性規劃學習筆記 一、非線性規劃的應用 非線性規劃&#xff08;Nonlinear Programming, NLP&#xff09;在很多領域都有重要應用&#xff0c;主要包括&#xff1a; 工程設計優化&#xff1a;結構優化、電路參數優化、交通線路設計經濟與管理&#xff1a;投資組合優化、生產計…

網絡模型深度解析:CNI、Pod通信與NetworkPolicy

目錄 專欄介紹 作者與平臺 您將學到什么&#xff1f; 學習特色 網絡模型深度解析&#xff1a;CNI、Pod通信與NetworkPolicy 第一部分&#xff1a;CNI 插件原理 - 網絡基礎設施的構建者 1.1 CNI 規范&#xff1a;標準化網絡接入的基石 1.2 Flannel&#xff1a;簡單高效的…

數據結構青銅到王者第二話---數據結構基本常識(2)

續接上一話 一、包裝類 在Java中&#xff0c;由于基本類型不是繼承自Object&#xff0c;為了在泛型代碼中可以支持基本類型&#xff0c;Java給每個基本類型都對應了一個包裝類型。 1、基本數據類型和對應的包裝類 除了 Integer 和 Character&#xff0c; 其余基本類型的包裝類…

fastdds qos:DeadlineQosPolicy

1含義DeadlineQosPolicy這種qos使用在DataWriter、DataReader、Topic。該qos用來監督數據是不是按照預期的頻率進行收發。假如數據是周期性發送和接收&#xff0c;周期是固定的100ms&#xff0c;我們如果想要監督數據收發是不是按照預期的周期進行的&#xff0c;那么就可以配置…