概述 本文描述WPF的附加屬性。對於使用MVVM框架的項目,附加屬性是非常重要的一個特性。 在MVVM框架下,ViewModel的代碼通過控制項的依賴屬性來控制控制項的,例如: //ViewModel public Visibility GridVisibility {get;set} public v ...
概述
本文描述WPF的附加屬性。對於使用MVVM框架的項目,附加屬性是非常重要的一個特性。
在MVVM框架下,ViewModel的代碼通過控制項的依賴屬性來控制控制項的,例如:
//ViewModel
public Visibility GridVisibility {get;set}
public void Show()
{
GridVisibility = Visibility.Visible;
}
public void Hide()
{
GridVisibility = Visibility.Collapsed;
}
//View
<Grid Visibility="{Binding GridVisibility}">
</Grid>
可以看出,我們通過修改GridVisibility 的值就改變了Grid的狀態。
現在有一個需求,要求在執行某個命令時,將輸入焦點定位到一個TextBox,我想TextBox是否有一個屬性:IsFocused?有就簡單了!事實上TextBox並沒有這個依賴屬性,這就麻煩了。如果不採用MVVM,我在代碼中執行txtBoxName.Focus();也就搞定了,但MVVM模式下沒有這種操作。這時候附加屬性就派上用場了。
你沒有IsFocused這個屬性,我給你加一個:
public class TextBoxHelper
{
/// <summary>
/// 附加屬性:IsFocused
/// </summary>
public static readonly DependencyProperty IsFocusedProperty =
DependencyProperty.RegisterAttached("IsFocused",
typeof(bool),
typeof(TextBoxHelper),
new FrameworkPropertyMetadata(false, OnIsFocusedPropertyChanged));
public static void SetIsFocused(DependencyObject dp, bool value)
{
dp.SetValue(IsFocusedProperty, value);
}
public static bool GetIsFocused(DependencyObject dp)
{
return (bool)dp.GetValue(IsFocusedProperty);
}
private static void OnIsFocusedPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
TextBox textBox = sender as TextBox;
if ((bool)e.NewValue)
{
textBox.Focus();
textBox.SelectAll();
}
}
}
以上就是這個附加屬性的定義。下麵需要把這個屬性提供給控制項:
<UserControl x:Class="LearnWPF.Pages.PageBasicCharacteristicView"
xmlns:xy="clr-namespace:LearnWPF.Controls.Helper;assembly=LearnWPF.Controls">
<TabControl>
<TabItem Header="附加屬性">
<Grid>
<TextBox xy:TextBoxHelper.IsFocused="{Binding IsTextBox2Focused}"/>
<Button Content="Focus TextBox2" Command="{s:Action FocusTextBox2}"/>
</Grid>
</TabItem>
</TabControl>
</UserControl>
然後,ViewModel中操作 IsTextBox2Focused即可控制TextBox的焦點了。
public class PageBasicCharacteristicViewModel : Screen
{
public bool IsTextBox2Focused { get; set; }
public void FocusTextBox2()
{
IsTextBox2Focused = true;
}
}
資源
系列目錄:WPF開發快速入門【0】前言與目錄
代碼下載:Learn WPF: WPF學習筆記 (gitee.com)
簽名區:
如果您覺得這篇博客對您有幫助或啟發,請點擊右側【推薦】支持,謝謝!