开发平台:VS2010
Datagrid数据绑定
xaml文件
<Window x:Class="WPF4ControlTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPF4ControlTest"
xmlns:assembly="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="357" Width="618">
<Window.Resources>
<ObjectDataProvider x:Key="sexEnum" MethodName="GetValues"
ObjectType="{x:Type assembly:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="local:SexOpt"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<Grid>
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" Margin="0,0,224,105" DataContext="{Binding Mode=OneWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Width="80" Binding="{Binding Name}" IsReadOnly="True"/>
<DataGridTextColumn Header="Age" Width="50" Binding="{Binding Age}"/>
<DataGridComboBoxColumn Width="80" Header="Sex"
SelectedItemBinding="{Binding Sex}"
ItemsSource="{Binding Source={StaticResource sexEnum}}"/>
<DataGridCheckBoxColumn Header="Pass Exam?" Width="100"
Binding="{Binding Pass}"/>
<DataGridHyperlinkColumn Header="Email" Width="150"
Binding="{Binding Email}"/>
</DataGrid.Columns>
</DataGrid>
<Button Content="Del" Height="23" HorizontalAlignment="Left" Margin="113,227,0,0" Name="CBtndel" VerticalAlignment="Top" Width="75" Click="CBtndel_Click" />
<Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="20,227,0,0" Name="CBtnAdd" VerticalAlignment="Top" Width="75" Click="CBtnAdd_Click" />
<Button Content="Change" Height="23" HorizontalAlignment="Left" Margin="208,227,0,0" Name="CBtnChange" VerticalAlignment="Top" Width="75" Click="CBtnChange_Click" />
<TextBox Height="134" HorizontalAlignment="Left" Margin="415,172,0,0" Name="CTbForDebug" Text="" VerticalAlignment="Top" Width="169" Background="#FF37B6EF" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" IsEnabled="True"></TextBox>
</Grid>
</Window>
CS代码
绑定
ObservableCollection<Member> memberData = new ObservableCollection<Member>(); dataGrid.DataContext = memberData;
- 注:只有对数据的记录进行增加或者删除的时候才能够进行从数据到界面的更新,而对其中的元素进行修改时,数据到界面不会实时更新,此时需要对集合的类实现
INotifyPropertyChanged
接口。 没有加接口的类的实现如下:
public class Member { public string Name { get; set; } public string Age { get; set; } public SexOpt Sex { get; set; } public bool Pass { get; set; } public Uri Email { get; set; } }
加了接口之后的类的实现如下:
public class Member : INotifyPropertyChanged
{
private string _name;
private bool _pass;
private string _age;
private SexOpt _sex;
private Uri _email;
//
public string Name
{
get
{
return _name;
}
set
{
_name = value;
this.Changed(“Name”);
}
}
public bool Pass
{
get
{
return _pass;
}
set
{
_pass = value;
this.Changed(“Pass”);
}
}
public string Age
{
get
{
return _age;
}
set
{
_age = value;
this.Changed(“Age”);
}
}
public Uri Email
{
get
{
return _email;
}
set
{
_email = value;
this.Changed(“Email”);
}
}
public SexOpt Sex
{
get
{
return _sex;
}
set
{
_sex = value;
this.Changed(“Sex”);
}
}#region 属性更改通知 public event PropertyChangedEventHandler PropertyChanged; private void Changed(string PropertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); } #endregion
}
Change响应事件定义如下:
public event PropertyChangedEventHandler PropertyChanged; private void Changed(string PropertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); }
注
- get和set的实现过程要么全部省略,要么全部实现,否则会报错;在加入接口之后,因为需要添加响应事件,get和set的实现过程一个都不能省略。
DataGrid
利用ObservableCollection
类实现数据绑定之后,实现了数据到界面的绑定(实现INotifyPropertyChanged
接口以后)以及界面到数据的绑定(如果界面可以编辑的话)目前比较容易实现绑定的是
ObservableCollection
和BindingList
集合,List
目前尚未实现,直接定义基于类的集合变量,然后进行绑定即可,绑定语句是dataGrid.DataContext = withClass.outCtrl; dataGrid.ItemsSource = memberData;
上面两者选其一即可;同时要对类实现
INotifyPropertyChanged
接口- 目前还做到了对其他类中集合的绑定
TextBlock绑定
控件之间的绑定
- 和TextBox相同
和成员变量的绑定(字符串绑定)
xaml语言
<TextBlock Height="23" HorizontalAlignment="Left" Margin="410,134,0,0" Name="CTblockForBind" VerticalAlignment="Top" Text="{Binding StrForBind}" />
后台语言
private string _strForBind = string.Empty; public string strForBind = "Dove"; public string StrForBind { get { if (_strForBind.Length == 0) _strForBind = "this is BindData"; return _strForBind; } set { _strForBind = value; } }
- 注:一定要实现get和set方法,否则无法完成绑定
- 现在存在的问题:之后更改成员变量时,其值不能实时地反应到界面上面去
含泪教训:主界面上的数据要和其界面控件关联,需要实现INotifyPropertyChanged
接口!!代码就是之前的Change
响应事件=。=试了一个晚上=。=
TextBox绑定
控件之间的绑定
代码
<TextBox Height="23" HorizontalAlignment="Left" Margin="398,81,0,0" Name="CTbForBind" VerticalAlignment="Top" Width="120" Text="{Binding Text, ElementName=CTbFirst, Mode=OneWay}" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="398,26,0,0" Name="CTbFirst" VerticalAlignment="Top" Width="120" />
一个TextBox内容改变时,另外一个控TextBox内容也发生改变,因为是OneWay的,所以反之不成立
控件与静态资源的绑定
关于TextBox的关联的讲解
看到5了
DatagridColumn
要想在Datagrid中通过C#语言增加或者配置列的内容等,可以按照以下内容配置
DataGridTextColumn dgtc00 = new DataGridTextColumn();
DataGridTextColumn dgtc01 = new DataGridTextColumn();
dgtc00.Header = "111";
dataGridList.Columns.Add(dgtc00);
dgtc00.Binding = new Binding("str");
dgtc01.Header = "222";
dataGridList.Columns.Add(dgtc01);
dgtc01.Binding = new Binding("type");
dataGridList.ItemsSource = dt;
其中,dt是一个类,里面包含str和type两个成员,且实现了get与set的方法。这段话可以为datagrid配置2列文本框。
注:绑定的对象一定要实现get与set的方法,否则会识别不了对象
DataGridTextColumn
Comobox绑定
绑定枚举类型
代码
`CCombobAllChannels.ItemsSource = Enum.GetValues(typeof(PromiseTech.Test.Base.Condition.ScKind));`