这个是我自己的学习记录,大佬们不喜勿喷,刚接触这个圈子一个月,为了给跟我一样的新手分享一下都能怎么实现数据绑定,互相参考,所以选择公开记录。
数据绑定弄清楚之后非常的简单,我这个练习绑定的数据选择在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以后有时间贴出。
在 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也一定要写好。
五、实现图。