1. 程式人生 > >[.Net碼農][WPF] ListView 中 View 的模板替換(新增/刪除列)

[.Net碼農][WPF] ListView 中 View 的模板替換(新增/刪除列)

=====================================================

今天在網上閒逛,突然發現這邊文章竟然被人毫不尊重原作者權益而胡亂轉載,讓人氣憤。

本著知識共享的目的,歡迎大家轉載,但是轉載請保留本文的原始連結,謝謝! 

本文原作者:YuanHui

=====================================================

    在WPF中使用ListView,往往需要根據情況隱藏或顯示ListView的某一列,我們當然可以通過程式碼來對付它(利用VisualTreeHelper.GetChild(listView)來得到某一個Column,然後隱藏它),但是,既然使用了WPF,我們就要入鄉隨俗,使用模板來處理。其實模板是個好東西,他提供了非常便利的定製機制,你可以把任意可視元素定義的面目全非——當然如果你願意


    為了增減ListView的Column,我們只需定義多個GridView資源,在執行時根據不同情況使用不同資源,就可以達到增減Column的目的。這裡其實都算不上是真正的模板替換。
    本文附帶原始碼可以在這裡下載到:TestListViewColumnCustom.rar
    下面就開始吧!
    老規矩,拖出VS2008,Create new project->WPF Application,名字就叫TestListViewColumnCustom吧,我一貫以“Test”開頭命名工程,這樣表明這是一個測試專案,是對ListViewColumnCustom所做的測試工程。點選OK後進入Window1.xaml
設計介面,拽一個ListView進主視窗(聽說通過敲Xaml程式碼來建立控制元件而不是通過“拽”來建立控制元件的人都是牛人,所以我喜歡敲程式碼;當然了,在WPF設計器不成熟的早期階段,很多控制元件定製後顯示不正常,你不敲程式碼還能去敲微軟?),新增幾個Column,併為視窗新增幾個Label、CheckBox,執行結果如下:


圖1 介面

Xaml程式碼如下:

複製程式碼 <Window x:Class="TestListViewColumnCustom.Window1"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    Title
="Window1" Height="300" Width="300">
        
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="42"/>
            <RowDefinition Height="32"/>
            <RowDefinition/>
            <RowDefinition Height="60"/>
        </Grid.RowDefinitions>
        <Label Margin="5" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" Foreground="Maroon">List View Column Custom</Label>
        <CheckBox Margin="5" Grid.Row="1" Grid.Column="0" Click="CheckBox_Click" VerticalAlignment="Center">Hide Last Column</CheckBox>
        <ListView Name="listView1" Margin="5" Grid.Row="2" Grid.Column="0">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name"></GridViewColumn>
                    <GridViewColumn Header="A" Width="60"></GridViewColumn>
                    <GridViewColumn Header="B" Width="60"></GridViewColumn>
                    <GridViewColumn Header="WillBeHiden"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <StackPanel Margin="5" Grid.Row="3" Grid.Column="0">
            <Label Foreground="Maroon">Author:He,YuanHui</Label>
            <Label Foreground="Maroon">Date:  2008.7.10</Label>
        </StackPanel>
    </Grid>
</Window>
複製程式碼
給ListView新增兩個(任意多個)GridView資源,擁有不同的Columns:
複製程式碼
    <Window.Resources>
        <GridView x:Key="haveHidnColumn">
            <GridViewColumn Header="Name"></GridViewColumn>
            <GridViewColumn Header="A" Width="60"></GridViewColumn>
            <GridViewColumn Header="B" Width="60"></GridViewColumn>
            <GridViewColumn Header="WillBeHiden"></GridViewColumn>
        </GridView>
        <GridView x:Key="haveNoHidnColumn">
            <GridViewColumn Header="Name"></GridViewColumn>
            <GridViewColumn Header="A" Width="60"></GridViewColumn>
            <GridViewColumn Header="B" Width="60"></GridViewColumn>
        </GridView>
    </Window.Resources> 複製程式碼
為CheckBox新增Click處理事件:
複製程式碼         private void CheckBox_Click(object sender, RoutedEventArgs e)
        {
            // select different template
            CheckBox checkBox = sender as CheckBox;
            if (checkBox.IsChecked == true)
            {
                this.listView1.View = this.Resources["haveNoHidnColumn"as GridView;
            }

            else
            {
                this.listView1.View = this.Resources["haveHidnColumn"as GridView;
            }


            // rebinding data
            this.listView1.ItemsSource = null;
            this.listView1.ItemsSource = dataList;
        }

複製程式碼
執行,點選CheckBox,可以發現最後一列可以動態“刪除”:

圖2 WillBeHiden列將被刪除

勾選CheckBox:

圖3 WillBeHiden列被刪除

為了顯得更加真實,上面綁定了資料:
複製程式碼         public Window1()
        {
            InitializeComponent();

            // init data
            for (int i = 0; i < 5; i++)
            {
                dataList.Add(new Data());
                dataList[i].Name = "data" + (i + 1).ToString();
                dataList[i].A = 1.0 + i / 10.0;
                dataList[i].B = 2.0 + i / 10.0;
            }


            this.listView1.ItemsSource = dataList;
        }

複製程式碼

簡單總結一下:思想就是,在資源中定義具有不同Column的資源,根據程式需要,為ListView繫結不同GridView,達到動態修改ListView的列的目的。

注意,由於資料繫結的關係,替換模板後需要重新繫結一下資料:
            // rebinding data
            this.listView1.ItemsSource = null;
            this.listView1.ItemsSource = dataList;


相關推薦

[.Net][WPF] ListView View模板替換新增/刪除

===================================================== 今天在網上閒逛,突然發現這邊文章竟然被人毫不尊重原作者權益而胡亂轉載,讓人氣憤。 本著知識共享的目的,歡迎大家轉載,但是轉載請保留本文的原始連結,謝謝!  本文原作者:YuanHui =====

【.Net】C#的partial class(部分類)

C# 2.0 可以將類、結構或介面的定義拆分到兩個或多個原始檔中,在類宣告前新增partial關鍵字即可。 例如:下面的PartialTest類 class PartialTest { string Str_FieldTest; int Int_FieldTes

android自定義View之自定義EditText新增刪除功能

           忙忙碌碌20天,新的專案終於接近尾聲了。今天公司召集幾個使用者體驗師和美工一起吐糟這20天做的這個新產品,對於產品提出了很多建議,這幾天就改介面了。在這個專案中大量的使用了EditText元件,並且添加了刪除功能。這裡面都是用RelativeLayou

【.NetWPF介面設計—擼大師

WPF介面設計,模仿了金山衛士,360,魯大師的介面! <!--無邊框窗體-->     <Stylex:Key="NoResize_window"TargetType="{x:Type Window}">     <Set

[.Net]分享非常漂亮的WPF介面框架原始碼及外掛化實現原理

在上文《分享一個非常漂亮的WPF介面框架》中我簡單的介紹了一個介面框架,有朋友已經指出了,這個介面框架是基於ModernUI來實現的,在該文我將分享所有的原始碼,並詳細描述如何基於ModernUI來構造一個非常通用的、外掛化的WPF開發框架。下載原始碼的同志,希望點選一下推薦。 本文將按照以下四點來介紹:

【.Net】初試T4模板

工具下載地址:【二選一 個人喜歡用 devart T4 Editor for Visual Studio 小巧 有些朋友 從網上下載外掛後 開啟專案 還是顯示純黑字型 沒有著色 和提示功能,但新建專案 和 新建模板 又正常解答【把你的老專案 升級上來

【.Net】.NET執行js指令碼的方法

一、後臺註冊js指令碼 在專案開發中,遇到了問題,當使用了UpdatePanel控制元件後,直接在後臺輸出js指令碼報錯了。 大家都知道向客戶端輸出內容的方式很多,而大多數初學者會使用Respone.Write(string)。比如: 以下是程式碼片段:

【.Net】C#.net檔案批量上傳解決方案附下載(swfupload)2015-8-28更新

因為最近專案需要多檔案同時上傳所以自己在網上找了下方法。swfupload做到了,所以我把我的C#.net環境的多檔案同時上傳共享給大家!(本例項最大隻能上傳500M的資料,如需要上傳更大的下面會告訴大家如何設定) 功能完全支援ie和firefox瀏覽器! 一般的WEB方式檔案上傳只能一個一個的進行上傳

【.Net】WebBrowser與IE的關係,如何設定WebBrowser工作在IE9模式下?

一.問題的提出 偶然發現,Winform裡的WebBrowser和IE實際安裝的版本似乎並不同步,很有趣! 下面有張圖,裡面一個視窗是用IE9開啟某網站,另一個視窗是用Winform+WebBrowser開啟同樣的網站,有意思的事情出現了。   在IE9視窗中,這個網站左邊選單樹無法顯示,原因是IE9使用

【.Net】修改WebBrowser控制元件的核心解決方案

首先說一下原理 當下很大瀏覽器他們都是用了IE的core, 這個core只提供HTML/JS的執行和渲染,並沒有給出關於介面和一些特性上的事,所以開發自己瀏覽器如果基於IE core需要自己完成這些內容。 一張圖很好的說明了這個情況,IE瀏覽器的架構:http://msdn.microsoft.com/e

【.Net】C# 啟動EXE檔案及帶啟動引數EXE

(一)、先製作一個帶啟動引數的EXE檔案。  步驟:             1、定義全域性私有變數:private string[] s = new string[1];  //這裡為了簡單起見,只做一個引數            2、  在窗體的建構

【.Net】ABP學習目錄傳送門

https://aspnetboilerplate.com/Pages/Documents/Zero/Startup-Template入門教程http://www.cnblogs.com/mienreal/p/4528470.htmlhttps://www.cnblogs.c

【.Net】DataGrid 資料繫結使用小結一

  做過ASP.NET開發的朋友都知道,ASP.NET提供了強大的列表資料控制元件,從ASP.NET1.1 時代的DataGrid,到ASP.NET2.0時代的GridView,再到ASP.NET3.5時代的ListView,功能越 來越強大,使用起來也非常的靈活.在Silverlight2中,同樣提供了一

[.Net].net呼叫外部exe檔案

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text

【.Net】C#反射獲取 所有欄位 及 私有欄位

using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace ReflectionDemo {

【.Net】【NPOI】NPOI對Excel的操作Sheet轉DataTable、List

通過NPOI對Excel進行操作,這裡主要是讀取的操作。封裝到ExcelHelper操作類中。 using System.Collections.Generic; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.U

【.Net】在 Web 窗體上報表檢視器 Web 控制元件需要 System.Web.UI.ScriptManager

異常詳細資訊: Microsoft.Reporting.WebForms.ScriptManagerNotFoundException: 在 Web 窗體上報表檢視器 Web 控制元件需要 System.Web.UI.ScriptManager。 源錯誤: [沒有相

[.Net]MVC——入門+最簡單的小例項

MVC全名是Model View Controller,是模型(model)-檢視(view)-控制器(controler)的縮寫,一種軟體設計典範,用於組織程式碼用一種業務邏輯和資料顯示分離的方法。 1.最上面直接面向用戶的"檢視層"(View)。它是提供

【.Net】用asp.net實現遠端獲取其他網站頁面指定內容

遠端獲取網頁內容.經過一定的處理和靈活應用,可以開發成成體系網站內容採集系統.通常也叫做"新聞小偷"一般來說.做內容採集分為如下幾個大致的步驟:   1.遠端獲取頁面的全部Html源文字.   2.通過過濾處理,分析有效內容文字.(通常用正則表示式來擷取有效資料)   3.將格式有效的資料,根據自己的資料庫結

【.Net】【MVC】多層架構+MVC+EF+AUTOFAC+AUTOMAPPER

1 namespace YTJWGL_EFDao 2 { 3 public class BaseEFDao<T> : IBaseDao<T> where T : class,new()//限制T的型別為class或者物件 4 { 5 6