1. 程式人生 > >WPF學習分享(一)——DataGrid

WPF學習分享(一)——DataGrid

使用DataGrid構建簡單的表格

最近由於想做一個Windows的桌面應用程式,正好最近看了一下C#,在網上找了一下關於Windwos桌面應用的相關檔案,最後選擇使用WPF來開發。


使用DataGrid用到的功能

  1. DataGrid通過使用資料繫結,實現資料的雙向通知。
  2. 在DataGrid的DataGridComboBoxColumn使用列舉。
  3. DataGrid的自定義Cell的使用。
  4. DataGrid多出的一行的去除。

首先定義一個Model,省略了部分程式碼

    public enum Sexs {,}
; public enum Roles { 非法使用者,全權使用者, 可寫使用者,只讀使用者 }; public delegate void change(User user); //實現介面以進行資料繫結 public class User : INotifyPropertyChanged { private String _name; //使用了委託,在單元格的值改變的時候呼叫委託,。, //本來是可以直接寫在監聽屬性變化的 //但是由於得到資料的時候也會觸發OnPropertyChanged() //所以就打算單獨使用delegate
//應該有更好的實現方法,暫時沒發現 public event change Change; #region 屬性 public String Name { get { return _name; } set { if (_name != value) { _name = value; OnPropertyChanged
(); } } } //省略。。。。。 #endregion public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); Change?.Invoke(this); } }

然後就是View層的實現了。

  1. 先是資料繫結,通過使用標籤的Binding屬性,將上面的Model的欄位對應到單元格上。
  2. 然後是列舉的使用。首先要引入列舉型別,使用xmlns:assembly="clr-namespace:System;assembly=mscorlib"引入,用到的列舉只要在xmlns:local="clr-namespace:AdressBook"這個名稱空間下就可以了。
  3. 日期的格式化輸出(與字元格式化輸出同理),通過在Binding裡面使用StringFormat='{}{0:yyyy年MM月dd日}',ConverterCulture=zh-CN即可。
  4. 如果要自定義GridData的單元格的內容,像是新增按鈕什麼的,可以使用標籤DataGridTemplateColumn
  5. DataGrid的在顯示的時候會自動生成最後一行,倒是展示的時候多了一行,可以通過設定DataGridCanUserAddRows的值為false,由於我直接在xaml設定的時候會警告,所以我就在Controller裡面設定了。。。
<UserControl x:Class="AdressBook.UserList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:AdressBook"
             xmlns:assembly="clr-namespace:System;assembly=mscorlib"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="800">

    <UserControl.Resources>
        <ObjectDataProvider x:Key="SexEnum" MethodName="GetValues"
                            ObjectType="{x:Type assembly:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:Sexs"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </UserControl.Resources>

    <DataGrid x:Name="data"  AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <!--<DataGridCheckBoxColumn Width="44" Header="" Binding="{Binding IsSelected}"/>-->
            <DataGridTextColumn Width="80" Header="ID" Binding="{Binding id}"/>
            <DataGridComboBoxColumn Width="80" Header="性別" ItemsSource="{Binding Source={StaticResource SexEnum}}" SelectedItemBinding="{Binding Sex}"/>
            <DataGridTextColumn Width="80" Header="生日"  Binding="{Binding Birthday,StringFormat='{}{0:yyyy年MM月dd日}',ConverterCulture=zh-CN}"/>
            <DataGridTemplateColumn Header="" Width="44">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="評論" Click="CommentAction"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</UserControl>


最後就是Controller的實現了。

    public partial class UserList : UserControl
    {
        static ObservableCollection<User> list;
        public UserList()
        {
            InitializeComponent();
            list = new ObservableCollection<User>(Mapper.GetInstance().Select());
            foreach (User u in list)
            {
            	//使用委託
                u.Change += change;
            }
            //設定資料來源
            data.DataContext = list;
            //讓DataGrid的最後一行消失
            data.CanUserAddRows = false;
        }

        private void ViewComment(object sender, RoutedEventArgs e)
        {
            .........
        }
		//資料改變的時候的操作
		void change(User user)
        {
        ........
        }
		
    }