WPF基础笔记(3)数据绑定
1. 绑定方式
OneWay
Source影响着Target,但是Target却影响不到Source。
OneWayToSource
arget影响Source,而Source却影响不到Target。
TwoWay
Source与Target相互影响。
OneTime
在OneWay的基础上延伸了一个OneTime,仅绑定一次。
2.数据转换器
<local:ColorConvert x:Key="myConvert"/>
<Style x:Key="item" TargetType="{x:Type ListViewItem}">
<Setter Property="Background">
<Setter.Value>
<Binding RelativeSource="{RelativeSource Self}" Converter="{StaticResource myConvert}"/>
</Setter.Value>
</Setter>
</Style>
<ListView ItemContainerStyle="{StaticResource ResourceKey=item}" >
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="年龄" DisplayMemberBinding="{Binding Age}"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
背景色转换器
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var item = value as ListViewItem;
//获取当前的item在当前的Listview中的位置
var view = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
var index = view.ItemContainerGenerator.IndexFromContainer(item);
//当Age=22是红色标示
if ((view.Items[index] as Student).Age ==22)
return Brushes.Red;
if (index % 2 == 0)
return Brushes.Pink;
else
return Brushes.Blue;
}
3.ObjectDataProvider
自动创建了一个Student对象
<ObjectDataProvider x:Key="Test" ObjectType="{x:Type local:Student}" MethodName="GetName"/>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public class Student
{
//前台要引用的方法
public string GetName()
{
return "一线码农";
}
}
4.数据验证
某个属性需要验证,需要自定义一个继承ValidationRule的类,重写Validate方法。
Window.Resources>
<local:Student x:Key="student"/>
</Window.Resources>
<TextBox DataContext="{StaticResource ResourceKey=student}" Name="textBox1" >
<TextBox.Text>
<Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
<!-- 自定义的验证规格,当然可以是多个Check -->
<Binding.ValidationRules>
<local:NameCheck />
<local:NameCheck11111 />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<TextBox.ToolTip>
<Binding RelativeSource="{RelativeSource Self}" Path="(Validation.Errors)[0].ErrorContent"/>
</TextBox.ToolTip>
</TextBox>
public class NameCheck : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
var name = Convert.ToString(value);
//如果名字长度大于4则是非法
if (name.Length > 4)
return new ValidationResult(false, "名字长度不能大于4个长度!");
return ValidationResult.ValidResult;
}
}
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}