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

问题描述 投票:0回答:1

鉴于此来源: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

}

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

static void OnIsBroughtIntoViewWhenSelectedChanged(
DependencyObject depObj, DependencyPropertyChangedEventArgs e)

维持。

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

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

c# wpf xaml dependency-properties
1个回答
1
投票

看一下文档:

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

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

摘抄:

如何创建附加属性

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

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

等等

它只是如何声明它们与普通的DependencyProperties语法不同。

© www.soinside.com 2019 - 2024. All rights reserved.