5

非常にシンプルな添付プロパティを作成しました。

public static class ToolBarEx 
{
    public static readonly DependencyProperty FocusedExProperty =
        DependencyProperty.RegisterAttached(
            "FocusedEx", typeof(bool?), typeof(FrameworkElement),
            new FrameworkPropertyMetadata(false, FocusedExChanged));

    private static void FocusedExChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is ToolBar)
        {
            if (e.NewValue is bool)
            {
                if ((bool)e.NewValue)
                {
                    (d as ToolBar).Focus();
                }
            }
        }
    }

    public static bool? GetFocusedEx(DependencyObject obj)
    {
        return (bool)obj.GetValue(FocusedExProperty);
    }

    public static void SetFocusedEx(DependencyObject obj, bool? value)
    {
        obj.SetValue(FocusedExProperty, value);
    }
}

Xamlでこれを設定することは完全にうまく機能しますが、スタイル内で設定しようとすると:

実行時にArguemntNullExceptionが発生します(「値をnullにすることはできません。パラメーター名:プロパティ」)。

ここで何が悪いのかわかりません。どんなヒントも適用されます!

4

1 に答える 1

11

添付された依存関係プロパティを登録するときによくある間違いは、ownerType引数を誤って指定することです。これは常に登録クラスである必要がありToolBarExます。

public static readonly DependencyProperty FocusedExProperty =
    DependencyProperty.RegisterAttached(
        "FocusedEx", typeof(bool?), typeof(ToolBarEx),
        new FrameworkPropertyMetadata(false, FocusedExChanged));

プロパティが変更されたハンドラーで不要なコードを回避するために、次のように安全にキャストできNewValueますbool

private static void FocusedExChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var toolBar = d as ToolBar;
    if (toolBar != null && (bool)e.NewValue)
    {
        toolBar.Focus();
    }
}
于 2012-11-10T11:40:37.983 に答える