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>

添付プロパティは常に null を返します...

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
local:TestFocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"

ユーザー コントロール自体への参照を取得し、ボタンを提供するパブリック プロパティを公開できます。これは最後の手段として使用できます。

ところで、添付プロパティに問題があったときはいつでも。私は通常、コールバックを配置するか、タイプをオブジェクトのタイプに変更する傾向があります。つまり、UIElement の代わりに、少なくともオブジェクトを使用する傾向があることを意味します。コールバックを取得し、コールバックの一部として正確なタイプが何であるかを確認します

乾杯

于 2012-09-21T04:49:20.980 に答える
0

私はあなたのコードをテストしましたが、依存関係プロパティ セッターで "public" キーワードを省略したことを除いて、私にとっては問題なく動作します。

それはタイプミスだと思います。そうでない場合は、それが問題です。

于 2012-09-14T15:02:11.563 に答える