关于多个FrameworkElement实例的DependencyProperty的行为
所以我尝试使用DependencyProperty
解决我在跨子视图传递本地ViewModel方面的问题。 然而,一个问题突然出现在我脑海中。
例如,我需要创建某个FrameworkElement
多个实例,比如UserControl
。 UserControl
定义了DependencyProperty
。 正如书中所述,依赖属性实例应该是static
和readonly
。 DependencyProperty
如何在这种情况下工作? 它是否与传统的UserControl
属性相同,或者传递给DependencyProperty
任何对象实例,它将被传递到所述UserControl
所有实例?
是的,它将作为正常财产运作。 如果您需要特定控件的属性,即单个控件的一个属性,则可以仅使用依赖项属性。 它们将通过该类的所有实例。 但是如果你想要许多控件上的属性,那么应该使用附加的依赖属性,该属性将可用于某个命名空间中的所有成员。 属性,例如:Canvas.Top,DockPanel.Dock 附加了 DependencyProperty。
附加依赖属性的示例:
public class MyDependencyClass : DependencyObject { public static readonly DependencyProperty IsSelectedProperty; public static void SetIsSelected(DependencyObject DepObject, Boolean value) { DepObject.SetValue(IsSelectedProperty, value); } public static Boolean GetIsSelected(DependencyObject DepObject) { return (Boolean)DepObject.GetValue(IsSelectedProperty); } private static bool IsSelectedValid(object Value) { if (Value.GetType() == typeof(bool)) { return true; } else { return false; } } static MyDependencyClass() { FrameworkPropertyMetadata MetaData = new FrameworkPropertyMetadata((Boolean)false); IsSelectedProperty = DependencyProperty.RegisterAttached("IsSelected", typeof(Boolean), typeof(MyDependencyClass), MetaData, new ValidateValueCallback(IsSelectedValid)); } }
它们还包含有用的回调函数,如OnPropertyChangedCallback , ValidateValueCallback ,它们可以放在一个额外的逻辑中。
这些属性也可在XAML中使用。 添加“本地”命名空间:
xmlns:local="clr-namespace:SampleApp"
为元素定义:
...
在触发器中访问属性:
在代码中使用附加的依赖项属性:
if (CurrentButtonName == MyButton.Name) { MyDependencyClass.SetIsSelected(CurrentButton, true); } else { MyDependencyClass.SetIsSelected(CurrentButton, false); }
有关详细信息,请参阅: http : //msdn.microsoft.com/en-us/library/ms749011.aspx