WPF学习记录之MVVM(一)数据绑定

        这个是我自己的学习记录,大佬们不喜勿喷,刚接触这个圈子一个月,为了给跟我一样的新手分享一下都能怎么实现数据绑定,互相参考,所以选择公开记录。

        数据绑定弄清楚之后非常的简单,我这个练习绑定的数据选择在DataGrid里面绑定,一开始感觉DataGrid很麻烦,之后感觉幸亏选择了DataGrid。

一、首先需要实现DataContext的绑定,要在MainWindow.xaml.cs的窗口构造器里面,将DataContext的数据源绑定好。

    public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainWindowViewModel();
        }

二、需要创建一个Model,我这个是商品,所以添加一个Goods,添加Model时,需要实现INotifyPropertyChanged接口,干什么的建议看MSDN。所以我建立了一个ViewModelBase类。

 public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

 创建好之后再创建Model。

 public class Goods : ViewModelBase
    {
        private string pid;
        private int gid;
        private decimal price;
        private string gname;
        private string providers;
        private DateTime expiredDate;
        private string description;



        public string Pid
        {
            get { return pid; }
            set { pid = value; RaisePropertyChanged("Pid"); }
        }


        public int Gid
        {
            get { return gid; }
            set { gid = value; RaisePropertyChanged("Gid"); }
        }


        public decimal Price
        {
            get { return price; }
            set { price = value; RaisePropertyChanged("Price"); }
        }


        public string Gname
        {
            get { return gname; }
            set { gname = value; RaisePropertyChanged("Gname"); }
        }


        public DateTime ExpiredDate
        {
            get { return expiredDate; }
            set { expiredDate = value; RaisePropertyChanged("ExpiredDate"); }
        }

        public string Description
        {
            get { return description; }
            set { description = value; RaisePropertyChanged("Description"); }
        }
    }

三、建立好Model就可以操作ViewModel类了。

创建好MainWindowViewModel,同样也需要继承ViewModel接口,绑定数据源建议使用

ObservableCollection<>

可以实时通知。

所以,ViewModel需要创建一个通过ObservableCollection来绑定的数据源。

  ObservableCollection<Goods> addGoodsData = new ObservableCollection<Goods>();
        public ObservableCollection<Goods> AddGoodsData
        {
            get { return addGoodsData; }
            set { addGoodsData = value; RaisePropertyChanged("AddGoodsData"); }
        }

四、通过数据库读取数据。

这是我的数据库数据,使用MySQL数据库,SQL以后有时间贴出。

WPF学习记录之MVVM(一)数据绑定

在   public MainWindowViewModel(){}里面执行SQL

            GoodsReader goodsReader = new GoodsReader();
            GoodsData = goodsReader.GetGoods();

这样数据源就读取出来了,最后一步就是绑定了,直接上代码。

<DataGrid x:Name="dgGoods" Grid.Row="3" Grid.RowSpan="5" Grid.ColumnSpan="5" Margin="15,0,15,-10" Height="300" VerticalAlignment="Top" ItemsSource="{Binding GoodsData,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
                                  SelectedItem="{Binding SelectItem,Mode=TwoWay}" IsReadOnly="True" CanUserAddRows="False" AutoGenerateColumns="False" ColumnHeaderStyle="{DynamicResource ColumnHeaderStyle}">
                            <DataGrid.Columns>

                                <DataGridTemplateColumn Header="编号" x:Name="gid" Width="1*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock TextWrapping="Wrap" Text="{Binding Gid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource RightAlignmentStyle}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="名称" x:Name="gname" Width="1.5*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock TextWrapping="Wrap" Text="{Binding Gname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource CenterAlignmentStyle}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="单价(元)" x:Name="price" Width="2*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock TextWrapping="Wrap" Text="{Binding Price, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource CenterAlignmentStyle}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="保质期(截止日)" x:Name="expired_date" Width="2.5*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock TextWrapping="Wrap" Text="{Binding ExpiredDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,StringFormat='yyyy-MM-dd'}" Style="{StaticResource CenterAlignmentStyle}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="供货商" x:Name="pid" Width="2*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock TextWrapping="Wrap" Text="{Binding Pid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource CenterAlignmentStyle}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="说明" x:Name="description" Width="6*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock TextWrapping="Wrap" Text="{Binding Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                            </DataGrid.Columns>
                        </DataGrid>

 另外说一下,Binding里面的{Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

很重要,一定要加。还有DataGrid里面的ItemSource也一定要写好。

五、实现图。

WPF学习记录之MVVM(一)数据绑定

上一篇:WPF UI页面等比例放大


下一篇:wpf之触发器