ToB企服应用市场:ToB评测及商务社交产业平台

标题: WPF开发快速入门【3】WPF的基本特性(附加属性) [打印本页]

作者: 知者何南    时间: 2022-9-16 17:21
标题: WPF开发快速入门【3】WPF的基本特性(附加属性)
概述
本文描述WPF的附加属性。对于使用MVVM框架的项目,附加属性是非常重要的一个特性。
 
在MVVM框架下,ViewModel的代码通过控件的依赖属性来控制控件的,例如:
  1. //ViewModel
  2. public Visibility GridVisibility {get;set}
  3. public void Show()
  4. {
  5.       GridVisibility = Visibility.Visible;
  6. }
  7. public void Hide()
  8. {
  9.       GridVisibility = Visibility.Collapsed;
  10. }
  11. //View
  12. <Grid Visibility="{Binding GridVisibility}">
  13. </Grid>
复制代码
可以看出,我们通过修改GridVisibility 的值就改变了Grid的状态。
现在有一个需求,要求在执行某个命令时,将输入焦点定位到一个TextBox,我想TextBox是否有一个属性:IsFocused?有就简单了!事实上TextBox并没有这个依赖属性,这就麻烦了。如果不采用MVVM,我在代码中执行txtBoxName.Focus();也就搞定了,但MVVM模式下没有这种操作。这时候附加属性就派上用场了。
 你没有IsFocused这个属性,我给你加一个:
  1.     public class TextBoxHelper
  2.     {
  3.         /// <summary>
  4.         /// 附加属性:IsFocused
  5.         /// </summary>
  6.         public static readonly DependencyProperty IsFocusedProperty =
  7.             DependencyProperty.RegisterAttached("IsFocused",
  8.             typeof(bool),
  9.             typeof(TextBoxHelper),
  10.             new FrameworkPropertyMetadata(false, OnIsFocusedPropertyChanged));
  11.         public static void SetIsFocused(DependencyObject dp, bool value)
  12.         {
  13.             dp.SetValue(IsFocusedProperty, value);
  14.         }
  15.         public static bool GetIsFocused(DependencyObject dp)
  16.         {
  17.             return (bool)dp.GetValue(IsFocusedProperty);
  18.         }
  19.         private static void OnIsFocusedPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
  20.         {
  21.             TextBox textBox = sender as TextBox;
  22.             if ((bool)e.NewValue)
  23.             {
  24.                 textBox.Focus();
  25.                 textBox.SelectAll();
  26.             }
  27.         }
  28.     }
复制代码
  以上就是这个附加属性的定义。下面需要把这个属性提供给控件: 
  1. <UserControl x:Class="LearnWPF.Pages.PageBasicCharacteristicView"              
  2.              xmlns:xy="clr-namespace:LearnWPF.Controls.Helper;assembly=LearnWPF.Controls">   
  3.     <TabControl>
  4.         <TabItem Header="附加属性">
  5.             <Grid>               
  6.                 <TextBox xy:TextBoxHelper.IsFocused="{Binding IsTextBox2Focused}"/>
  7.                 <Button Content="Focus TextBox2" Command="{s:Action FocusTextBox2}"/>
  8.             </Grid>
  9.         </TabItem>      
  10.     </TabControl>
  11. </UserControl>
复制代码
 然后,ViewModel中操作 IsTextBox2Focused即可控制TextBox的焦点了。
  1.     public class PageBasicCharacteristicViewModel : Screen
  2.     {
  3.         public bool IsTextBox2Focused { get; set; }
  4.         public void FocusTextBox2()
  5.         {           
  6.             IsTextBox2Focused = true;            
  7.         }
  8.     }
复制代码
   
资源
系列目录:WPF开发快速入门【0】前言与目录 
代码下载:Learn WPF: WPF学习笔记 (gitee.com)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4