1 前端:
<TextBox Text="{Binding Path=host, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
绑定元素属性 {Binding Path=host, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
2 模型:
[Serializable]
public class XmlVisitInfo:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
private string myPort { get; set; }
public string port
{
get { return myPort; }
set { myPort = value; OnPropertyChanged(new PropertyChangedEventArgs("port")); }
}
}
实现INotifyPropertyChanged接口,实现PropertyChanged属性
3 后台绑定值
XmlVisitInfo info = new XmlVisitInfo();
this.DataContext = info;
模型数据赋值给DataContext
4 后台获取值
XmlVisitInfo info = this.DataContext as XmlVisitInfo;
扩展知识:
WPF支持双向绑定,即从源到目标以及目标到源,要支持双向绑定,只需要设置Binding对象的Mode属性为TwoWay即可,修改后的XAML代码为:
当使用OneWay或TwoWay绑定时,改变后的值会立即从源传播到目标。然而,从目标到源传播未必会立即发生。因为,它们的行为是由Binding.UpdateSourceTrigger属性控制,该属性可以使用下图列出的某个值。注意,UpdateSourceTrigger属性值并不影响目标的更新方式,它仅仅控制TwoWay模式或OneWayToSource模式的绑定更新源的方式。而文本框正是使用LostFocus方式从目标向源进行更新的。
绑定非元素对象
上面都是介绍如何链接两个元素的绑定,但是在数据驱动的应用程序中,更常见的情况是创建从一个对象中提起数据的绑定表达式。不过希望绑定的信息必须存储在一个公有属性中。因为WPF绑定不能获取私有信息或公有字段。
当绑定一个非元素对象时,不能使用Binding.ElementName属性,但可以使用以下属性中的一个:
- Source——该属性是指向源对象的引用,即提供数据的对象。
- RelativeSource——该属性使用RelativeSource对象指定绑定源的相对位置,默认值为null。
- DataContext属性——如果没有使用Source或RelativeSource属性指定一个数据源,WPF会从当前元素开始在元素树中向上查找。检查每个元素的DataContext属性,并使用第一个非空的DataContext属性。当然你也可以自己设置DataContext属性。
使用DataContext属性来绑定一个自定义对象的属性。首先自定义一个实现了INotifyPropertyChanged接口的类。这个接口是为了发出属性更改的通知,即实现了这个接口将会实现当源对象的公共属性发生改变时,该属性的值会立即响应到界面上显式。当然不实现这个接口的对象也可以绑定控件中,只要被绑定是公有属性就可以。
绑定grid的列表的值
1 设置datagrid 名字 x:Name
<DataGrid x:Name="ipList">
2 设置行名字,并绑定每一行的值
<DataGrid.Columns>
<DataGridTextColumn Header="域名" Binding="{Binding Path=url, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="*"/>
</DataGrid.Columns>
3 给datagrid赋值
ipList.ItemsSource = new info();
4 获取选中值
ipList.SelectedItem;
注意:所有绑定控件,都要在初始化的时候赋一个初值。不然无法获取到值
完整代码:
<Grid Margin="0,196,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="49*"/>
<ColumnDefinition Width="23*"/>
</Grid.ColumnDefinitions>
<DataGrid Grid.Row="0" RowHeaderWidth="0" AlternationCount="2" AutoGenerateColumns="False" FontSize="15" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" HorizontalScrollBarVisibility="Hidden" EnableRowVirtualization="False" IsEnabled="True" EnableColumnVirtualization="False" VerticalGridLinesBrush="#FFBCC1BC" HorizontalGridLinesBrush="#FFBCC1BC" Margin="0,-117,0,0" Grid.ColumnSpan="2" x:Name="ipList">
<DataGrid.Columns>
<DataGridTextColumn Header="域名" Binding="{Binding Path=url, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="*"/>
<DataGridTextColumn Header="编码" Binding="{Binding Path=encoding, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="50"/>
<DataGridTextColumn Header="正则表达式" Binding="{Binding Path=regex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
<Button Content="添加" HorizontalAlignment="Left" Margin="15,-181,0,0" VerticalAlignment="Top" Width="74" RenderTransformOrigin="0.899,0.568" Click="btnAddIpList"/>
<Button Content="删除" HorizontalAlignment="Left" Margin="114,-181,0,0" VerticalAlignment="Top" Width="76" Click="btn_Delete"/>
</Grid>
参考资料