离散的角色wpf依赖属性获取和设置扩展

时间:2017-12-30 11:20:10

标签: c# wpf xaml dependency-properties

鉴于此来源:external code base

这个静态类具体来说:

public static class TreeViewItemBehavior
{

public static bool GetIsBroughtIntoViewWhenSelected(TreeViewItem treeViewItem)
{
    return (bool)treeViewItem.GetValue(IsBroughtIntoViewWhenSelectedProperty);
}

public static void SetIsBroughtIntoViewWhenSelected(
  TreeViewItem treeViewItem, bool value)
{
    treeViewItem.SetValue(IsBroughtIntoViewWhenSelectedProperty, value);
}

public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty =
    DependencyProperty.RegisterAttached(
    "IsBroughtIntoViewWhenSelected",
    typeof(bool),
    typeof(TreeViewItemBehavior),
    new UIPropertyMetadata(false, OnIsBroughtIntoViewWhenSelectedChanged));

static void OnIsBroughtIntoViewWhenSelectedChanged(
  DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
    TreeViewItem item = depObj as TreeViewItem;
    if (item == null)
        return;

    if (e.NewValue is bool == false)
        return;

    if ((bool)e.NewValue)
        item.Selected += OnTreeViewItemSelected;
    else
        item.Selected -= OnTreeViewItemSelected;
}

static void OnTreeViewItemSelected(object sender, RoutedEventArgs e)
{
    // Only react to the Selected event raised by the TreeViewItem
    // whose IsSelected property was modified. Ignore all ancestors
    // who are merely reporting that a descendant's Selected fired.
    if (!Object.ReferenceEquals(sender, e.OriginalSource))
        return;

    TreeViewItem item = e.OriginalSource as TreeViewItem;
    if (item != null)
        item.BringIntoView();
}

#endregion // IsBroughtIntoViewWhenSelected

}

" Get"的作用是什么?和" Set"前缀方法?添加此类,并在XAML中将TreeView.ItemControlsStyle Setter属性设置为静态依赖项属性,将其值设置为" True"按预期工作。如果我同时注释掉get和set前缀方法并重新编译,Intellisense会抱怨样式的属性不能为null,但编译仍然是成功的,并且

的功能
static void OnIsBroughtIntoViewWhenSelectedChanged(
DependencyObject depObj, DependencyPropertyChangedEventArgs e)
保持

如果两个方法名称都以任何方式更改,则投诉仍然存在,如果只有一种方法被注释掉/修改,则投诉不存在。

这是实现属性get和set的另一种方法吗?控件是否会自动搜索“获取/设置+属性名称”' XAML中的扩展方法? 当get和set extentions被禁用/注释掉时,如何/为什么能够工作?可以在指定的链接中找到类和xaml引用。我通过将其声明为x:Static来修改指定的XAML属性ref,这是唯一的修改。感谢您的任何见解...

1 个答案:

答案 0 :(得分:1)

查看文档:

DependencyProperty.RegisterAttached Method (String, Type, Type, PropertyMetadata, ValidateValueCallback)

引导您attached-properties-overview详细描述了它们的创建:

摘录:

  

如何创建附加属性

     

如果您的类严格定义附加属性以用于其他类型,则该类不必从DependencyObject派生。但是如果你遵循整体WPF模型,你需要从DependencyObject派生你的附加属性也是一个依赖属性。

     

通过声明类型为public的{​​{1}} static readonly字段,将附加属性定义为依赖项属性。您可以使用RegisterAttached方法的返回值来定义此字段。字段名称必须与附加的属性名称匹配,并附加字符串Property,以遵循已建立的WPF模式,即命名标识字段与它们表示的属性。 附加的媒体资源提供商还必须提供DependencyProperty static PropertyName Get PropertyName 方法作为访问者附属物;如果不这样做,将导致财产系统无法使用您附加的财产。

等。

简单地说明如何声明它们与普通的DependencyProperties语法不同。