在WPF程式設計中資料綁定非常常用,這個功能使用得當可以大幅的簡化程式邏輯,提高效率,如下根據使用中的情況簡要做了總結。
資料綁定發生在源對象和目标對象之間,當源對象或目标對象的屬性值發生改變時,所綁定的對象也會跟着發生改變
* 資料綁定的目标對象一定是Dependency Object,所綁定的目标對象的屬性一定是Dependency Property
* 源對象可以是Dependency Object/Dependency Property,也可以是一般的.net對象
綁定模式:
* OneWay:源對象發生改變時,目标對象也跟着改變;目标對象發生改變時,源對象不變化
* TwoWay:源對象發生改變時,目标對象也跟着改變;目标對象發生改變時,源對象也跟着變化
* OneTime:隻在初始化時發生作用,資料從源對象傳遞到目标對象
* OneWayToSource:和OneWay類似,不同的是源對象随着目标對象的變化而變化
* Default:源對象的屬性如果是隻讀的,選擇為OneWay;如果源對象的屬性是讀寫的,選擇為TwoWay,大多的情況 适用
對象是否實作了INotifyPropertyChanged,是選擇綁定的依據
【初次使用常迷惑的問題是,綁定的.net對象修改時,而目标不變化,此時主要的問題是一般的.net對象沒有實作INotifyPropertyChanged的原因;對于集合的綁定也類似,可以使用ObservableCollection <T>這個容器類構造集合輔助處理】
綁定的路徑設定,可以選擇各種形式,從屬性、數組、XPath等等
///Binding.Path Property 的類型
///Path=PropertyName
///Path=ShoppingCart.Order
///Path=(DockPanel.Dock).
///Path=ShoppingCart.ShippingInfo[MailingAddress,Street]
///Path="[(sys:Int32)42,(sys:Int32)24]"
///Path=/
///Path=/Offices/ManagerName
///Path=.
this.objectBind.DataContext = this.person;
對于綁定中設定的不同類型很常用,如我們常見的日期的顯示等都可以采用這種形式轉換為符合自己需要的形式
[ValueConversion(typeof(string), typeof(int))]
public class NumberConvert : IValueConverter
{
public object Convert(object value, Type typeTarget, object param, CultureInfo culture)
{
string inputValue = value.ToString();
int c;
int.TryParse(inputValue, out c);
if (param != null)
{
var p = Int32.Parse(param as string);
c += p;
}
return c;
}
public object ConvertBack(object value, Type typeTarget, object param, CultureInfo culture)
int.TryParse(value.ToString(), out c);
c -= p;
return c.ToString();
}
對于綁定的資料如果允許編輯,可以通過資料簡要防止不符合要求的資料更新到對象中
<TextBox Name="validRule" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}">
<TextBox.Text>
<Binding Path="Count" NotifyOnValidationError="true">
<Binding.ValidationRules>
<local:SelfValidRule Age="100"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
public class SelfValidRule : ValidationRule
{
public int Age
{
get;
set;
}
public SelfValidRule()
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
int age;
if (!int.TryParse(value.ToString(), out age))
{
return new ValidationResult(false, "輸入無效字元!");
}
if (age < 0 || age > this.Age)
return new ValidationResult(false, "太大!");
return ValidationResult.ValidResult;
}
在複雜的場合,我們可能需要把不同的資料對象綁定到界面元素上,此時我們可以使用如下的一些比較複雜的支援類輔助完成這些工作
* MultiBinding CompositeCollection PriorityBinding
以上類可參考MSDN的詳細解釋。
以上例子的詳細位址參考:
<a href="http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/wpf%5E_binding.rar">http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/wpf%5E_binding.rar</a>