ListView、TreeView和DataGrid。


1、ListView。

ListView繼承自簡單的沒有特色的ListBox,並使用View屬性進行擴展。增加了對基於列顯示的支持,並增加了快速切換視圖或顯示模式的能力,而不需要重新綁定數據以及重新構建列表。其中View屬性是是一個擴展點,用於創建內容豐富的列表,如果沒有設置View屬性,ListView控件的行為就類似於功能較少的祖先ListBox控件的行為。ListView目前只提供了GridView視圖,用於創建多列是非常有用的。GridView類繼承自ViewBase類,表示具有多列的列表視圖,通過為GridView.Columns集合添加GridViewColumn對象可定義這些列。

GridView和GridViewColumn都提供了一些有用的方法,可使用這些方法定制列表的顯示外觀。為創建最簡單、最直觀的列表,只需要為每個GridViewColumn對象設置兩個屬性:Header屬性和DisplayMemberBinding,Header屬性提供放在頂部的文本,而DIsplayMemberBinding屬性包含一個綁定,該綁定從每個數據項提取希望顯示的信息。

1.1)、通過ListView顯示數據。

xaml代碼: 

<ListView Name="listView1">
    <!--通過listView視圖-->
    <ListView.View>
        <!--通過設置提供的GridView視圖-->
        <GridView>
            <GridView.Columns>
                <!--設置Header屬性和DisplayMemberBinding屬性-->
                <GridViewColumn Header="產品編號" DisplayMemberBinding="{Binding Path=ProId}"></GridViewColumn>
                <GridViewColumn Header="產品名字" DisplayMemberBinding="{Binding Path=ProName}"></GridViewColumn>
                <GridViewColumn Header="產品價格" DisplayMemberBinding="{Binding Path=ProPrice, StringFormat={}{0:C}}"></GridViewColumn>
                <GridViewColumn Header="產品描述" DisplayMemberBinding="{Binding Path=ProDescribe}"></GridViewColumn>
                <GridViewColumn Header="產品圖片路徑" DisplayMemberBinding="{Binding Path=ProImagePath}"></GridViewColumn>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

后台代碼:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += MainWindow_Loaded;
    }

    Bll.ProductBll productBll = App.ProductBll;
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        this.listView1.ItemsSource = productBll.GetCollectionProduct2();
    }
}

效果圖:

1.2)、改變列的尺寸。

可為GridViewColumn設置width屬性來改變列的寬度。這種設置只是確定了列的初始寬度,不會組織用戶通過單機列標題邊緣來修改列寬。如果希望完全禁止修改列的尺寸,唯一的選擇就是為GridViewColumn的標題提供新模板。 

<GridViewColumn Width="80" Header="產品編號" DisplayMemberBinding="{Binding Path=ProId}"></GridViewColumn>

1.3)、單元格模板。

在為單元格中顯示數據,GridViewColumn.DisplayMemberBinding屬性並不是唯一的選擇,而另一個選擇是使用CellTemplate屬性,該屬性使用的是是數據模板。注意:如果同時為GridViewColumn設置了DisplatyMemberBinding和CellTemplate屬性,那么默認會使用DisplayMemberBinding屬性為單元格設置內容並完全忽略模板。

<!--不使用DisplayMemberBinding屬性,使用CellTemplate屬性,效果是一樣的。-->
<GridViewColumn Header="產品名字">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=ProName}"></TextBlock>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

1.4)、單元格中顯示圖片。

xaml代碼: 

<GridViewColumn Header="產品圖片">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Image Width="50" Height="50">
                <Image.Source>
                    <Binding Path="ProImagePath">
                        <Binding.Converter>
                            <local:ImagePathConverter></local:ImagePathConverter>
                        </Binding.Converter>
                    </Binding>
                </Image.Source>
            </Image>
        </DataTemplate>
    </GridViewColumn.CellTemplate>                            
</GridViewColumn>

效果圖:

1.5)、自定義列標題。

如果不希望保持灰色的列標題方框,可以通過通過以下幾種方式設置他們。

a)、通過HeaderTemplate模板進行設置,這個數據模板可以綁定到在GridViewColumn.Header屬性中指定的任何對象。

<GridViewColumn Width="70" DisplayMemberBinding="{Binding Path=ProId}">
    <GridViewColumn.Header>                                
        <Border CornerRadius="3" Background="Salmon">
            <TextBlock>產品名稱</TextBlock>
        </Border>
        <!--如果直接在HeadTemplate中定義數據模板是行不通的-->
        <!--<DataTemplate>
            <TextBlock>產品名稱</TextBlock>
        </DataTemplate>-->
    </GridViewColumn.Header>
</GridViewColumn>

效果圖:

b)、如果重新格式化特定的標題,可使用GridViewColumn.HeaderContainerStyle屬性提供的樣式。如果希望以相同的方式重新格式化所有的列標題,就需要改用GridView.ColumnHeaderContainerStyle屬性。

c)、如果希望完全改變標題的外觀,可以通過設置GridViewColumn.HeaderTemplaterSelector或GridViewColumnTemplaterSelector屬性,使用模板選擇器為特定的標題設置正確的模板。

 

 

 

 

3、DataGrid控件。

DataGrid控件是用來顯示數據的控件,從對象集合獲取信息並在具有行和單元格的網格中顯示信息。每行和單獨的對象相對應,並且在每列和對象的某個屬性相對應。

3.1)、為DataGrid控件添加數據。

xaml代碼: 

<Grid>
    <DataGrid Name="dataGrid1"></DataGrid>
</Grid>

 后台代碼:

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Loaded += MainWindow_Loaded; } Bll.ProductBll productBll = App.ProductBll; void MainWindow_Loaded(object sender, RoutedEventArgs e) { this.dataGrid1.ItemsSource = productBll.GetCollectionProduct2(); } }

 效果圖:

 

3.2)、DataGridView控件的基本屬性。

DataGrid控件的基本顯示屬性
名稱 說明
RowBackground DataGrid中的行的背景顏色。
AlternationRowBackground 交替行背景色。
ColumnHeaderHeight 標題列的高度。
RowHeaderWidth 具有行標題頭的寬度。
ColumnWidth 每列的寬度。
RowHeight 每行的高度。
GridLinesVisibility 確定是否顯示網格線。
VerticalGridLinesBrush 用於繪制列之間的網格線的畫刷。
HorizontalGrdiLinesBrush 用於繪制行之間網格線的畫刷。
HeadersVisibility 確定顯示哪個題頭的DataGridHeaders。
HorizontalScrollBarVisibility 是否顯示水平滾動條。
VerticalScrollBarVisibility 是否顯示垂直滾動條。
CanUserResizeColumns 阻止用戶通過拖動邊緣來改變大小。
CanUserReorderColumns 阻止用戶從一個位置拖動到另外一個位置。
AutoGenerateColumns 關閉自動生成列功能。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.3)、定義列。

使用自動生成的列,可快速創建顯示所有數據的DataGrid控件,但放棄了一些控制能力。例如,不能控制列的順序,每列的寬度,以及如何格式化列中的值以及列中的標題。DataGrid控件支持以下幾種類型的列。

a)、DataGridTextColumn。這種類對於大部分數據類型是標准選擇。

b)、DataGridCheckBoxColumn。這種列用於顯示復選框。

c)、DataGridHyperlinkColumn。這種列顯示可單機的列。

d)、DataGridComboBox。這種列用於顯示下拉框的ComboBox。

e)、DataGridTemplateColumn。這種列功能非常強大。

3.3.1)、DataGridTextColumn。

有兩個常用屬性:Visibility屬性和DisplayIndex。其中Visibility屬性來動態地顯示和隱藏列,DisplayIndex用於來設置列的位置。

DataGridTextColumn普通寫法: 

<DataGrid Name="dataGrid1" CanUserResizeColumns="False" CanUserReorderColumns="False" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <!--設置Header屬性和Binding屬性。-->
        <DataGridTextColumn Header="商品價格" Binding="{Binding Path=ProPrice,StringFormat={}{0:C}}">
    </DataGridTextColumn>
</DataGrid>

 效果圖:

DataGridTextColumn的其他用法:

<DataGrid Name="dataGrid1" CanUserResizeColumns="False" CanUserReorderColumns="False" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="商品編號" Binding="{Binding Path=ProId}"></DataGridTextColumn>        
        <DataGridTextColumn Header="商品名稱" Binding="{Binding Path=ProName}"></DataGridTextColumn>
        <DataGridTextColumn>
            <!--設置Header屬性。-->
            <DataGridTextColumn.Header>
                <!--設置圓角-->
                <Border CornerRadius="5" Background="Blue">
                    <TextBlock Foreground="BlueViolet">商品價格</TextBlock>
                </Border>
            </DataGridTextColumn.Header>
            <!--設置Binding屬性。-->
            <DataGridTextColumn.Binding>
                <Binding Path="ProPrice" StringFormat="{}{0:C}"></Binding>
            </DataGridTextColumn.Binding>                    
        </DataGridTextColumn>        
    </DataGrid.Columns>
</DataGrid>

 效果圖:

 3.3.2)、DataGridCheckBoxColumn。

與DataGridTextColumn一樣,使用Binding屬性提取數據。是用於設置內部CheckBox元素的IsChecked屬性的true或者false值。

<DataGridCheckBoxColumn Header="選中狀態" Binding="{Binding Path=ProIsDrag}"> </DataGridCheckBoxColumn> 

效果圖:

 3.3.3)、DataGridHyperlinkColumn。

 3.3.4)、DataGridComboBoxColumn。

 3.3.4)、DataGridTemplateColumn。]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]有待完善!!!!!!!!!!!!!

3.4)、設置列的格式和樣式。

可通過ElementStyle屬性創建應用於DataGrid單元格內部的元素的樣式。對於簡單的DataGridTextColumn,該元素是TextBlock,對於DataGridCheckBoxColumn,單元格內部的元素是復選框。對於DataGridTemplateColumn,單元格內部的元素是在數據模板中創的任何元素。

xaml代碼: 

<!--設置換行樣式,要設置列的寬度。-->
<DataGridTextColumn Header="商品描述" Binding="{Binding Path=ProDescribe}" Width="60">                    
    <DataGridTextColumn.ElementStyle>
        <!--設置樣式。-->
        <Style TargetType="TextBlock">
            <!--設置TextBlock元素的TextWrapping屬性。-->
            <Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter>
        </Style>                        
    </DataGridTextColumn.ElementStyle>                    
</DataGridTextColumn>

效果圖:

其中,ElementStyle提供了設置特定列中所有單元格的格式的方法。然而在某些情況下,可能希望為每一列中的每個單元格應用格式化設置。完成該工作的最簡單的方式是為DataGrid.RowStyle屬性設置樣式,DataGrid控件還提供了少部分用於設置網絡其他部分(如列標題頭和行標題頭)格式的額外屬性。

基於樣式的DataGrid屬性
屬性 樣式的適用范圍
ColumnHeaderStyle 樣式的適用范圍
RowHeaderStyle 位於網格頂部的列標題的TextBlock。
RowStyle 用於普通行(在列種沒有遇到通過列的ElementStyle屬性確定制過的行為)的TextBlock。
DragIndicatorStyle 當用戶正在將列標題頭拖動到新位置時用於列標題頭的TextBlock。

 

 

 

 

 

 

3.5)、設置行的格式(e.Row.Background)。

很多情況下,標識包含特定數據的行更有用,例如,可強調價格較高的產品和到期的貨運,可通過處理DataGrid.LoadingRow事件已編程的方式應用此類格式。這個時候需要使用DataGridTemplate和自定義值轉換器。

每當一行的數據出現在屏幕上時,都會立即為該行為引發LoadingRow事件,這種方式的優點是應用程序不必永遠格式化整個網絡;相反,只為當前可見的行為引發LoadingRow事件,但也有缺點,當用戶在網格中滾動時,會連續引發LoadingRow事件。因此在LoadingRow方法中不能放置耗時的代碼。

后台代碼:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += MainWindow_Loaded;
    }

    Bll.ProductBll productBll = App.ProductBll;
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        this.dataGrid1.ItemsSource = productBll.GetCollectionProduct2();
    }

    //突出背景。
    private SolidColorBrush highLightBrush = new SolidColorBrush(Colors.Orange);

    //默認背景。
    private SolidColorBrush defaultlBrush = new SolidColorBrush(Colors.White);

    /// <summary>
    /// LoadingRow事件。
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        try
        {
            //將行對象轉換成Product對象。
            Models.Product product = (Models.Product)e.Row.DataContext;
            //如果價錢大於5就為每一行設置背景色為橘黃色。
            if (product.ProPrice > 5)
            {
                e.Row.Background = highLightBrush;
            }
            else
            {
                //設置行背景色為白色。
                e.Row.Background = defaultlBrush;
            }
        }
        catch (Exception)
        {

        }
    }
}

效果圖:

3.6)、顯示行細節(RowDetailsTemplate)。

可通過設置RowDetailsVisibilityMode屬性來配置行細節區域的顯示行為。默認情況下是VisibleWhenSelected,如果設置成Visible就會立即可看到。

xaml代碼: 

<Grid>
     <DataGrid Name="dataGrid1" LoadingRow="dataGrid1_LoadingRow">
        <!--RowDetailsTemplate模板 -->
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <Border Margin="10" Padding="10" BorderBrush="SteelBlue" BorderThickness="3" CornerRadius="5">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition Width="2*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="{Binding Path=ProId}"></TextBlock>
                        <TextBlock Grid.Column="1" Text="{Binding Path=ProName}"></TextBlock>
                        <TextBlock Grid.Column="2" Text="{Binding Path=ProPrice, StringFormat={}{0:C}}"></TextBlock>
                        <Image Grid.Column="3" Width="50" Height="50" VerticalAlignment="Top">
                            <Image.Source>
                                <Binding Path="ProImagePath">
                                    <Binding.Converter>
                                        <local:ImagePathConverter></local:ImagePathConverter>
                                    </Binding.Converter>
                                 </Binding>
                            </Image.Source>
                        </Image>
                    </Grid>
                </Border>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
View Code

 后台代碼不變,效果圖:

3.7)、凍結列。

FrozenColumnCount屬性表示。如果設置FrozenColumnCount 屬性 = 1,就說明是第1列被凍結了。

<!--設置DataGrid的第1列為凍結。-->
<DataGrid Name="dataGrid1" LoadingRow="dataGrid1_LoadingRow" RowDetailsVisibilityMode="VisibleWhenSelected" FrozenColumnCount="1">

效果圖:

3.8)、選擇。

與普通的列表控件類似,DataGrid控件允許用戶選擇單個項,當選擇一項時,可以響應SelectionChanged事件。為找到當前選擇的數據對象,可使用SelectedItem屬性。如果希望用戶能夠選擇多行,可將SelectionMode屬性設置為Extended(默認是Single),為了選擇多行,用戶必須按下shift或Ctrl鍵,可從SelectedItems屬性中檢索選項的集合。

xaml代碼: 

<Grid>        
    <!--DataGrid 的SelectionChanged事件。-->
    <DataGrid Name="dataGrid1" SelectionChanged="dataGrid1_SelectionChanged"> </DataGrid>   
</Grid>

 后台代碼:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += MainWindow_Loaded;
    }

    Bll.ProductBll productBll = App.ProductBll;

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        this.dataGrid1.ItemsSource = productBll.GetCollectionProduct2();
    }

    //事件代理函數。
    private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        //轉換成Product對象。
        Models.Product product = (Models.Product)this.dataGrid1.SelectedItem;
        //彈出信息。
        MessageBox.Show(product.ProName);
    }
}

 效果圖:

 

3.9)、排序。

可通過設置列的SortMemberPath屬性從綁定的數據對象中選擇不同的屬性,可以通過設置CanUserSortColumns屬性設置為false來禁用排序。

3.10)、編輯。

DataGrid控件最方便之處在於支持編輯,當用戶雙擊DataGrid單元格時,該單元格會切換到編輯模式,但可以通過以下幾種方式進行控制:

a)、DataGrid.IsReadOnly屬性設置為 True 時,用戶不能編輯。

b)、DataGridColumn.IsReadOnly屬性設置為true時,用戶不能編輯。

c)、只讀屬性。如果數據對象具有沒有屬性設置器的屬性,DataGrid控件足夠智能,它能夠注意到該細節,並且進制編輯列。

 

 

 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM