我正在實施名爲PhoneBox的UserControl
,其中包含一個TextBox
,一些自定義邏輯,並且有一個名爲PhoneNo的DependencyProperty。它將用於雙向綁定場景,LostFocus
爲UpdateSourceTrigger
。所以我寫了下面的代碼 -如何在UserControl中實現更新LostFocus源代碼的DependencyProperty?
XAML(用戶控件):
<StackPanel>
<TextBox Name="txtPhone" MinWidth="120" MinHeight="23" LostFocus="txtPhone_LostFocus" GotFocus="txtPhone_GotFocus"/>
</StackPanel>
代碼隱藏(用戶控件):
public partial class PhoneBox : UserControl
{
//Some Code
static PhoneBox()
{
FrameworkPropertyMetadata phoneNoMetadata =
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnPhoneNoChanged),
new CoerceValueCallback(CoercePhoneNoValue));
PhoneNoProperty = DependencyProperty.Register("PhoneNo", typeof (string), typeof (PhoneBox),
phoneNoMetadata,
new ValidateValueCallback(ValidatePhoneNoValue));
}
public readonly static DependencyProperty PhoneNoProperty;
public string PhoneNo
{
get { return (string)GetValue(PhoneNoProperty); }
set { SetValue(PhoneNoProperty, value); }
}
private static void OnPhoneNoChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PhoneBox phoneBox = (PhoneBox)d;
string newValue = (string)e.NewValue;
phoneBox.txtPhone.Text = newValue;
}
private static object CoercePhoneNoValue(DependencyObject d, object basevalue)
{
return basevalue;
}
private static bool ValidatePhoneNoValue(object value)
{
return true;
}
private void txtPhone_LostFocus(object sender, RoutedEventArgs e)
{
this.SetValue(PhoneNoProperty, this.txtPhone.Text);
}
private void txtPhone_GotFocus(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(txtPhone.Text))
this.txtPhone.Text = this.FilterText(txtPhone.Text);
}
private string FilterText(string text)
{
//Some cutom logic
}
//Some more Code
}
XAML(消費者):
<pbc:PhoneBox PhoneNo="{Binding Path=User.Phone, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>
它作品。但我的問題是,我使用txtPhone_LostFocus
事件處理程序來設置proerty值(反過來更新源)的方式是否恰當?有沒有更適當的方法來做到這一點?我是這個DependencyProperty
的新手,所以任何指導,建議和意見將非常感謝。
你一定要明白引發LostFocus是文本框的默認?我做的是 – 2012-07-19 07:57:10
。這裏的重點不是特定於「TextBox」。 – atiyar 2012-07-19 08:01:13
關於綁定語法:Mode = TwoWay是TextBox.Text的默認設置,你可以沒有。 RelativeSource雖然很複雜,但是可以到這裏。您甚至可以爲您的程序集聲明一個XAML名稱空間,並使用UserControls精確類型,如{x:Type my:PhoneBox},以便更具體。通常情況下,我會使用ElementName綁定語法,但是隨後您需要爲UserControl提供一個x:Name屬性,並且如果您在其自己的XAML中設置了該屬性,並且然後使用UserControl的客戶端XAML嘗試設置x:Name在外面。 – hbarck 2012-08-28 17:44:16