无法获得附加财产价值

时间:2013-06-05 12:31:46

标签: wpf mvvm attached-properties

嗨,我希望我能在这里找到一些帮助...

我正在使用prism和MVVM创建一个WPF应用程序。

我正在尝试创建一个附加属性,我发现here

在我的ViewModel中,我得到了专注的元素

var control = Keyboard.FocusedElement;

然后我做

string value = ExtraTextBehaviourObject.GetExtraText(control as UIElement);

但返回的值始终为null ...任何人都可以指向正确的方向吗???

更新

public class ExtraTextBehaviourObject : DependencyObject
    {
        //Declare the dependency property
        public static readonly DependencyProperty ExtraTextProperty;

        static ExtraTextBehaviourObject()
        {
            //register it as attached property
            ExtraTextProperty = DependencyProperty.RegisterAttached("ExtraText", typeof(string),
                                                                    typeof(ExtraTextBehaviourObject));
        }

        //static function for setting the text
        public static void SetExtraText(UIElement uiElement, string value)
        {
            if (uiElement != null)
            {
                uiElement.SetValue(ExtraTextProperty, value);
            }
        }

        //static function for getting the text
        public static string GetExtraText(UIElement uiElement)
        {
            if (uiElement != null)
            {
                return (string)uiElement.GetValue(ExtraTextProperty);
            }
            return "";
        }
    }

在XAML中设置代码

<dxe:TextEdit Text="{Binding Path=Customer.Comments, Mode=TwoWay}" AcceptsReturn="True" VerticalContentAlignment="Top"
                                  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  Behaviors:ExtraTextBehaviourObject.ExtraText="HelloExtraText"
                                  ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"/>

2 个答案:

答案 0 :(得分:0)

问题是当我使用Keyboard.FocusedElement时,我没有得到正确的控件。当我使用它们的控件时,这可能是一个devexpress的东西。所以向上遍历元素树直到我得到那个控件解决了我的问题......谢谢Clemens!

答案 1 :(得分:0)

只是一个额外的想法:你可以让WPF为你做这件事,而不是亲自遍历树。使用FrameworkPropertyMetadataOptions.Inherits标记附加属性现在,您可以在设置附加属性的初始控件的所有子项中检索该值。 例如

<Grid MyService.MyProperty="True">
   <TextBox .../>


var txt = aSender as TextBox;
var val = MyService.GetMyProperty(txt);

Inherits GetMyProperty会返回true,因为它会继承&#34;来自其父Grid的值,当然没有继承值,false(不为null,因为它是一个值类型)。

例如,

DataContext也是一个继承的依赖属性。