2

我有以下附加属性定义:

public class TestFocusManager
{
    public static readonly DependencyProperty FocusedElementProperty =
      DependencyProperty.RegisterAttached("FocusedElement", 
          typeof (UIElement), typeof(TestFocusManager));

    public static UIElement GetFocusedElement(DependencyObject obj)
    {
      return (UIElement) obj.GetValue(FocusedElementProperty);
    } 

    public static void SetFocusedElement(DependencyObject obj, UIElement value)
    {
      obj.SetValue(FocusedElementProperty, value);
    }
}

当我尝试在我的用户控件中使用它时:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:sys="clr-namespace:System;assembly=mscorlib" 
             mc:Ignorable="d" 
             xmlns:Behaviors="clr-namespace:MyLocalProject.Behaviors" 
             Behaviors:TestFocusManager.FocusedElement="{Binding ElementName=testElement}"
             x:Class="LocalProject.TestView"
             x:Name="_testView">
    <TextBox x:Name="testElement" />
</UserControl>

附加的属性总是返回一个空...

var result = TestFocusManager.GetFocusedElement(_testView); // <-- null...
var result2 = _testView.GetValue(TestFocusManager.FocusedElementProperty); // <-- again, null...

我在这里做错了什么?提前致谢!

4

3 回答 3

1

您的问题是GetFocusedElement在实际设置绑定之前调用它(您可能在 UserControl 的构造函数中调用它)。如果你在Loaded事件中调用它,它应该没问题。

于 2012-09-14T20:08:11.917 回答
0

我测试了你的代码,它对我来说很好,除了你在依赖属性设置器中省略了“public”关键字。

我假设这是一个错字,如果不是,那就是你的问题。

于 2012-09-14T15:02:11.563 回答
0
local:TestFocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"

您可以获得对用户控件本身的引用并公开一个提供按钮的公共属性。您可以将此作为最后的手段!

顺便说一句,每当我遇到附加属性问题时。我通常倾向于放置回调或将类型更改为 Object 的类型,我的意思是 UIElement 倾向于使用对象,至少我得到一个回调并检查作为回调的一部分的确切类型是什么

干杯

于 2012-09-21T04:49:20.980 回答